1

我创建了一个基于 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 文件中,并且<class-loader delegate="false" />在 sun-web.xml 中也有设置。有人可以帮助我为什么 Glassfish 类加载器以这种方式工作,我该如何解决这个问题?

4

1 回答 1

0

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

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

有了这个 Glassfish 将允许在你的 war 文件中使用你的库。但即使使用此设置,将 CXF 与 WS-Securityy 与 Metro 一起使用也是有问题的。更好的解决方案是使用只有 Web 配置文件而不是完整配置文件的 Glassfish,因为 Web 配置文件不包含 Metro。

于 2013-07-03T15:15:41.133 回答