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. パッケージ) を「保護」することがわかりました。それが、私の戦争のライブラリにあるクラスではなく、モジュールディレクトリにあるクラスを見つけて使用する理由です。これを解決するには、JVM オプションを domain.xml に追加する必要があります。

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

これにより、Glassfish は war ファイルでライブラリを使用できるようになります。しかし、この設定でも、CXF を Metro と一緒に WS-Securityy で使用するのは問題があります。より良い解決策は、Web プロファイルには Metro が含まれていないため、フル プロファイルではなく Web プロファイルのみで Glassfish を使用することです。

于 2013-07-03T15:15:41.133 に答える