Glassfish上的Apache CXF问题

时间:2013-06-20 12:59:01

标签: glassfish jax-ws cxf ws-security

我创建了一个基于Apache CXF(2.7.5)的Web服务应用程序,将其部署在Glassfish 3.0.1上,并且在我启用WS-Sec支持之前它可以正常工作。然后,当我尝试执行Web服务请求时,我收到以下异常:

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类加载器以这种方式工作,我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

我设法发现Glassfish(至少3.0.1版本)修改了默认的类加载行为,以“保护”它的类路径中的一些包(主要是javax。包)。这就是为什么它在它的模块目录中找到并使用类而不是我的war的lib中的类的原因。 要解决此问题,应将jVM选项添加到domain.xml:

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

使用此Glassfish将允许在war文件中使用您的库。但即使使用此设置,使用带有WS-Securityy的CXF和Metro也存在问题。更好的解决方案是使用只有Web Profile而不是Full Profile的Glassfish,因为Web Profile没有包含Metro。