使用EclipseLink MOXy作为JBoss EAP 6.1上JAX-WS的JAXB提供程序



我正在尝试使用EclipseLink MOXy作为部署在JBoss EAP 6.1.0.Beta1应用服务器上的JAX-WS web服务的JAXB提供商。目前,我已经实现了这里描述的javax.xml.ws.Provider,并将jaxb.properties文件放入包含我的Provider实现和web服务中使用的域类的包中。以下是此文件的内容:

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

当我尝试部署包含服务的web应用程序时,我在日志中出现以下错误:

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

在我的案例中,使用MOXy作为JAXB提供程序的主要原因是能够在子类中使用@XmlValue注释。当我尝试使用MOXy在测试应用程序中使用与web服务相同的类来解组时,不会发生此错误。此外,堆栈中没有来自org.eclipse.persistence包及其子包的类,只有com.sun.xml.bind.v2类。显然,在部署web应用程序时没有使用MOXy。来自org.eclipse.persistence的所有必需的Maven工件都在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是在调用web服务时在运行时调用的。但错误发生在部署时。除了Provider之外,我还应该重新实现什么吗?

第一步是确保EclipseLink库位于正确的位置。您可以尝试直接使用MOXyAPI而不是将MOXy配置为JAXB提供程序吗?

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);
    }
}

似乎无法将自定义JAXB提供程序与ApacheCXF 2.6.6一起使用,后者在JBoss EAP 6.1.0.Beta1中用作JAX-WS提供程序。实例化JAXBContext的上下文工厂被硬编码为在ApacheCXF中实例化com.sun.xml.bind.v2.ContextFactory(请参阅ApacheCXF源代码中JAXBContextCache类的createContext静态方法)。

UPD:很抱歉回答错误。有一种方法可以在ApacheCXF支持的web服务中使用MOXy作为JAXB提供者。例如:

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);
        }
    }
}

最新更新