2013-06-27 1 views
2

JBoss EAP 6.1.0.Beta1 애플리케이션 서버에 배치 된 JAX-WS 웹 서비스 용 JAXB 공급자로 EclipseLink MOXy를 사용하려고합니다. 지금은 javax.xml.ws.Provider을 설명한대로 here을 입력하고 웹 서비스에 사용 된 Provider 구현 및 도메인 클래스가 포함 된 패키지에 jaxb.properties 파일을 배치합니다. 다음은이 파일의 내용은 다음과 같습니다JBoss EAP 6.1에서 JAX-WS 용 EclipseLink MOXy 사용하기

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory 

나는 로그에 다음과 같은 오류가 서비스를 포함하는 웹 응용 프로그램을 배포 할 때 :

@XmlValue is not allowed on a class that derives another class 

주된 이유 JAXB-으로 뜸을 사용하기를 공급자가 내 경우에 서브 클래스에서 @XmlValue 주석을 사용할 수 있어야합니다. MOXy를 사용하는 테스트 응용 프로그램에서 웹 서비스에 사용 된 것과 동일한 클래스로 언 마샬하려고하면이 오류가 발생하지 않습니다. 또한 org.eclipse.persistence 패키지와 해당 하위 패키지의 스택 트레이스에는 클래스가 없으며 대신 com.sun.xml.bind.v2 클래스 만 있습니다. 분명히, MOXy는 웹 애플리케이션이 배치 될 때 사용되지 않습니다. org.eclipse.persistence에서 필요한 모든 메이븐 아티팩트는 WAR 파일에 있습니다 : 내가 잘못 뭐하는 거지

$ jar tf my-app.war | grep org.eclipse.persistence 
WEB-INF/lib/org.eclipse.persistence.antlr-2.5.0.jar 
WEB-INF/lib/org.eclipse.persistence.asm-2.5.0.jar 
WEB-INF/lib/org.eclipse.persistence.moxy-2.5.0.jar 
WEB-INF/lib/org.eclipse.persistence.core-2.5.0.jar 

? 늘어나는만큼 이해 웹 서비스가 호출 될 때 Provider 런타임에 호출됩니다. 그러나 배포 시간에 오류가 발생합니다. Provider 외에 뭔가를 다시 구현해야합니까?

답변

1

첫 번째 단계는 EclipseLink 라이브러리가 올바른 위치에 있는지 확인하는 것입니다. MOXy를 JAXB 제공자로 구성하는 대신 MOXy API를 직접 사용할 수 있습니까?

import org.eclipse.persistence.jaxb.JAXBContext; 
import org.eclipse.persistence.jaxb.JAXBContextFactory; 

public class Demo { 

    public static void main(String[] args) { 
     JAXBContext jc = JAXBContextFactory.createContext(new Class[] {Foo.class, Bar.class}), null); 
    } 

} 
+1

나는 이것을 시도했다. MOXy API를 사용할 수 있습니다. – vect

0

제이보스 EAP 6.1.0.Beta1에서 JAX-WS 공급자로 사용되는 ApacheCXF 2.6.6와 사용자 정의 JAXB 프로 바이더를 사용할 수없는 것 같다. 아파치 CXF에서 com.sun.xml.bind.v2.ContextFactory을 인스턴스화하기 위해 JAXBContext가 하드 코드되어있다. (ApacheCXF 소스 코드에서 클래스의 createContext 정적 메소드 참조).

UPD : 잘못된 대답을 드려 죄송합니다. ApacheCXF 기반 웹 서비스에서 JAXB 제공 업체로 MOXy를 사용하는 방법이 있습니다. 예 :

import org.eclipse.persistence.jaxb.JAXBContextFactory; 
... 

@ServiceMode(Service.Mode.PAYLOAD) 
@WebServiceProvider(
     portName = "...", 
     serviceName = "...", 
     targetNamespace = "...", 
     wsdlLocation = "..." 
) 
public class MyService implements Provider<Source>{ 

    private JAXBContext jaxbContext; 

    public MyService() { 
     try { 
      this.jaxbContext = JAXBContextFactory.createContext(new Class[]{ 
        ... 
      }, null); 
     } catch (JAXBException e) { 
      throw new WebServiceException(e); 
     } 
    } 

    @Override 
    public Source invoke(Source request) { 
     try { 
      Unmarshaller unmarshaller = this.jaxbContext.createUnmarshaller(); 
      ... 
     } catch (JAXBException e) { 
      throw new WebServiceException(e); 
     } 
    } 
}