2013-06-20 124 views
0

我創建了一個基於Apache CXF(2.7.5)的Web服務應用程序,將它部署在Glassfish 3.0.1上,並且它工作良好,直到我打開WS-Sec支持。然後,我得到下面的異常,當我嘗試做一個Web服務請求:Glassfish上的Apache CXF問題

Caused by: javax.xml.crypto.NoSuchMechanismException: class configured for XMLSignatureFactory(provider: ApacheXMLDSig)cannot be found. 

    at javax.xml.crypto.dsig.XMLDSigSecurity.doGetImpl(Unknown Source) ~[webservices-osgi.jar:1.0] 
    at javax.xml.crypto.dsig.XMLDSigSecurity.getImpl(Unknown Source) ~[webservices-osgi.jar:1.0] 
    at javax.xml.crypto.dsig.XMLDSigSecurity.getImpl(Unknown Source) ~[webservices-osgi.jar:1.0] 
    at javax.xml.crypto.dsig.XMLSignatureFactory.findInstance(Unknown Source) ~[webservices-osgi.jar:1.0] 
    at javax.xml.crypto.dsig.XMLSignatureFactory.getInstance(Unknown Source) ~[webservices-osgi.jar:1.0] 
    at org.apache.ws.security.message.WSSecSignature.init(WSSecSignature.java:127) ~[wss4j-1.6.10.jar:1.6.10] 
    at org.apache.ws.security.message.WSSecSignature.<init>(WSSecSignature.java:120) ~[wss4j-1.6.10.jar:1.6.10] 
    at org.apache.cxf.ws.security.wss4j.policyhandlers.AbstractBindingBuilder.getSignatureBuilder(AbstractBindingBuilder.java:1730) ~[cxf-rt-ws-security-2.7.5.jar:2.7.5] 
    at org.apache.cxf.ws.security.wss4j.policyhandlers.AsymmetricBindingHandler.doSignature(AsymmetricBindingHandler.java:546) ~[cxf-rt-ws-security-2.7.5.jar:2.7.5] 
    at org.apache.cxf.ws.security.wss4j.policyhandlers.AsymmetricBindingHandler.doSignBeforeEncrypt(AsymmetricBindingHandler.java:147) ~[cxf-rt-ws-security-2.7.5.jar:2.7.5] 
    ... 273 common frames omitted 
Caused by: java.lang.ClassNotFoundException: org.apache.jcp.xml.dsig.internal.dom.DOMXMLSignatureFactory 
    at org.apache.felix.framework.ModuleImpl.findClassOrResourceByDelegation(ModuleImpl.java:744) ~[felix.jar:na] 
    at org.apache.felix.framework.ModuleImpl.access$100(ModuleImpl.java:61) ~[felix.jar:na] 
    at org.apache.felix.framework.ModuleImpl$ModuleClassLoader.loadClass(ModuleImpl.java:1656) ~[felix.jar:na] 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247) ~[na:1.6.0_43] 

似乎CXF調用由GlassFish的默認Web服務提供者實現包含調用它自己的一個替代的XMLSignatureFactory類(它在xmlsec .jar文件)。所有CXF文件都打包到我的war文件中,並在sun-web.xml中設置<class-loader delegate="false" />。 有人可以幫助我爲什麼Glassfish classloader以這種方式工作,我該如何解決這個問題?

回答

0

我設法發現Glassfish(至少是3.0.1版本)修改默認的類加載行爲,以「保護」它的類路徑中的一些包(通常是javax.packages)。這就是爲什麼它在模塊目錄中找到並使用類而不是在我的戰爭庫中的類。 爲了解決這個JVM選項應該被添加到domain.xml中:

<jvm-options>-Dcom.sun.enterprise.overrideablejavaxpackages=javax.xml.crypto,javax.xml.crypto.dsig</jvm-options> 

有了這個Glassfish的將允許使用庫在你的戰爭文件。但即使使用此設置,使用帶有WS-Securityy的CXF以及Metro也是有問題的。更好的解決方案是使用僅帶有Web Profile的Glassfish而不使用Full Profile,因爲Web Profile沒有包含Metro。