2013-06-27 45 views
2

我試圖使用EclipseLink MOXy作爲部署在JBoss EAP 6.1.0.Beta1應用服務器上的JAX-WS web服務的JAXB提供者。目前,我已按here所述實施了javax.xml.ws.Provider,並將jaxb.properties文件放入包含我的Provider實現和網絡服務中使用的域類的包中。下面是這個文件的內容:在JBoss EAP 6.1上使用EclipseLink MOXy作爲JAX-WS的JAXB提供者

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

當我嘗試部署包含我在日誌中出現以下錯誤該服務網絡的應用程序:

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

的主要原因使用莫西作爲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之外,我還應該重新實現嗎?

回答

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

這似乎是無法使用與ApacheCXF 2.6.6被用作在JBoss的EAP 6.1.0.Beta1 JAX-WS提供定製JAXB提供商。上下文工廠實例化JAXBContext被硬編碼以在ApacheCXF中實例化com.sun.xml.bind.v2.ContextFactory(參見createContext靜態方法,在ApacheCXF源代碼中爲JAXBContextCache類)。

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); 
     } 
    } 
} 
相關問題