2014-02-11 4 views
3

JBoss 4에서 JBoss 6.1 EAP로 응용 프로그램을 포팅합니다. 이 응용 프로그램은 스프링과 함께 cxf를 사용합니다. 고객의 요구 사항은 jboss 용 모듈을 변경 (또는 추가하지 않음)한다는 것입니다.JBoss 6.1로 마이그레이션, cxf 용 스프링 추가

jboss cxf 모듈에는 선택적 종속성이 있지만 기본적으로 스프링 모듈은 없습니다. 내가 궁금해 하던데 :

  1. JBoss에 스프링 모듈을 추가해야합니까?
  2. 응용 프로그램 lib 디렉토리에 스프링 jar 파일을 추가 할 수 있습니까?
  3. 이 기능을 작동시키는 가장 좋은 방법은// 가장 쉬운 방법은 무엇입니까?

나는, 내가받을 다음과 같은 오류 스프링 모듈을 만들고 응용 프로그램 lib 디렉토리에 봄 항아리를 추가하지 않으면 :

09:19:44,203 WARN [org.jboss.modules] (MSC service thread 1-1) Failed to define class org.apache.cxf.transport.servlet.CXFServlet in Module "org.apache.cxf.impl:main" from local module loader @1f06dc3 (finder: local module finder @1b64e6a (roots: C:\dev\jboss-eap-6.1\modules,C:\dev\jboss-eap-6.1\modules\system\layers\base)): java.lang.LinkageError: Failed to link org/apache/cxf/transport/servlet/CXFServlet (Module "org.apache.cxf.impl:main" from local module loader @1f06dc3 (finder: local module finder @1b64e6a (roots: C:\dev\jboss-eap-6.1\modules,C:\dev\jboss-eap-6.1\modules\system\layers\base))) 
    at org.jboss.modules.ModuleClassLoader.defineClass(ModuleClassLoader.java:427) [jboss-modules.jar:1.2.0.Final-redhat-1] 
    at org.jboss.modules.ModuleClassLoader.loadClassLocal(ModuleClassLoader.java:260) [jboss-modules.jar:1.2.0.Final-redhat-1] 
    at org.jboss.modules.ModuleClassLoader$1.loadClassLocal(ModuleClassLoader.java:75) [jboss-modules.jar:1.2.0.Final-redhat-1] 
    at org.jboss.modules.Module.loadModuleClass(Module.java:526) [jboss-modules.jar:1.2.0.Final-redhat-1] 
    at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:188) [jboss-modules.jar:1.2.0.Final-redhat-1] 
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:444) [jboss-modules.jar:1.2.0.Final-redhat-1] 
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:432) [jboss-modules.jar:1.2.0.Final-redhat-1] 
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:399) [jboss-modules.jar:1.2.0.Final-redhat-1] 
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:399) [jboss-modules.jar:1.2.0.Final-redhat-1] 
    at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:374) [jboss-modules.jar:1.2.0.Final-redhat-1] 
    at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:119) [jboss-modules.jar:1.2.0.Final-redhat-1] 
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:316) [rt.jar:1.6.0_17] 
    at java.lang.Class.forName0(Native Method) [rt.jar:1.6.0_17] 
    at java.lang.Class.forName(Class.java:247) [rt.jar:1.6.0_17] 
    at org.jboss.as.server.deployment.reflect.DeploymentClassIndex.classIndex(DeploymentClassIndex.java:54) 
    at org.jboss.as.ee.component.deployers.InterceptorAnnotationProcessor.processComponentConfig(InterceptorAnnotationProcessor.java:85) [jboss-as-ee-7.2.0.Final-redhat-8.jar:7.2.0.Final-redhat-8] 
    at org.jboss.as.ee.component.deployers.InterceptorAnnotationProcessor.deploy(InterceptorAnnotationProcessor.java:77) [jboss-as-ee-7.2.0.Final-redhat-8.jar:7.2.0.Final-redhat-8] 
    at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:120) 
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811) 
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) [rt.jar:1.6.0_17] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) [rt.jar:1.6.0_17] 
    at java.lang.Thread.run(Thread.java:619) [rt.jar:1.6.0_17] 
Caused by: java.lang.NoClassDefFoundError: org/springframework/context/ApplicationListener 
    at java.lang.ClassLoader.defineClass1(Native Method) [rt.jar:1.6.0_17] 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:616) [rt.jar:1.6.0_17] 
    at org.jboss.modules.ModuleClassLoader.doDefineOrLoadClass(ModuleClassLoader.java:344) [jboss-modules.jar:1.2.0.Final-redhat-1] 
    at org.jboss.modules.ModuleClassLoader.defineClass(ModuleClassLoader.java:422) [jboss-modules.jar:1.2.0.Final-redhat-1] 
    ... 22 more 
+0

이 질문에 대한 답변이있는 사람이 있습니까? 그 질문은 너무 어렵고, 명확하지 않고, 너무 어리 석다. – user3296533

답변

1

TL; DR

  1. Spring이 더 이상 필요하지 않은 JAX-WS 엔드 포인트 빈의 라이프 사이클을 관리하기를 원한다면.
  2. 아니요, 스프링 기반 CXF 기능을 앱에서 직접 사용하려는 경우가 아닙니다. # 1을 참조하십시오. 그러나 읽는 것을 계속하십시오 ...
  3. 가장 쉬운 방법은 JBossWS가 JAX-WS 엔드 포인트를 관리하게하고, SpringBeanAutowiringSupport을 앱의 ApplicationContext와 통합하도록 확장하는 것입니다. 자세한 내용은 아래를 참조하십시오. (7 AS) 제이보스 EAP 6 Spring 관리 JAX-WS 엔드 포인트와 응용 프로그램을 마이그레이션 - 세부

나는 같은 문제에 직면했다.

EAP 6의 JBossWS는 양날의 검입니다. 그것은 매우 편리합니다.은 JAX-WS 엔드 포인트를 설정하고, 앱에서 기본 CXF 엔진에 대한 모든 지식을 추출하지만, 엔드 포인트에 대한 제어권을 포기해야합니다.

CXF의 스프링 네임 스페이스를 사용하고 엔드 포인트를 단일 서블릿 뒤에있는 스프링 빈으로 정의하는 대신 Spring 컨텍스트에서 해당 빈을 제거하고 각 컨테이너를 web.xml의 서블릿으로 정의해야한다. 실제로 서블릿!).

JBossWS는 런타임에 이러한 의사 서블릿을 자동 감지하고 그 뒤에 필요한 CXF 인프라를 구축합니다.

이것은 모두 잘되고 좋은 일이지만, Spring 관리 종속성을 엔드 포인트에 주입해야한다면 어떻게해야할까요?

SpringBeanAutowiringSupport! 분명히 이것은 Spring IoC를 컨테이너 관리 빈과 통합하는이 클래스의 주요 이유였습니다.

엔드 포인트에서이 클래스를 확장 한 다음 @Autowired (등)을 통해 종속성을 주입 할 수 있습니다.

Spring ApplicationContext를 부트 스트랩하기 위해 web.xml에서 여전히 청취자 클래스로 ContextLoaderListener을 사용해야 함을주의하십시오.- 앱이 이제 CXF 완전히 무관 할 수 있다는 또한

참고가 다음 중 하나를 수행하지해야 의미 :

  • 확장 또는 CXF 클래스를 직접
  • 참조를 사용을 어떤 CXF 제공 Spring 컨텍스트 파일 (예 : classpath:META-INF/cxf/cxf.xml)
  • (예 xmlns:jaxws="http://cxf.apache.org/jaxws")
앱의 봄 설정에서 어떤 CXF 네임 스페이스를 사용 0

단점은 앱에서 더 이상 고급 CXF 관련 기능을 사용할 수 없지만 어쨌든 필요하지 않다는 것입니다.

관련 문제