0

CXF を使用して Web サービス クライアントを作成および実行するためのコードをいくつか書きました。.wsdl ファイルからクライアントを作成するために JaxWsClientFactoryBean を使用しました (これが最適なソリューションかどうかはわかりません)。ここでの目標は、Spring などを回避してプログラムでこれを行うことでした。Java と CXF を使用した純粋なコードです。

JaxWsClientFactoryBean cfb = new JaxWsClientFactoryBean();
cfb.setAddress(getServiceProperty(intClass, PROPERTY_KEY_URL_SUFFIX));
cfb.setServiceClass(intClass);
cfb.setOutInterceptors(getOutInterceptors(intClass));
cfb.setServiceName(SERVICE_NAME);
cfb.setWsdlURL("classpath:wsdl/" + intClass.getSimpleName() + ".wsdl");
cfb.setEndpointName(ENDPOINT_NAME);
Client client = cfb.create();
ClientProxy cp = new ClientProxy(client);
I intService = (I) 
   Proxy.newProxyInstance(intClass.getClassLoader(), new Class[] { intClass }, cp);

これが正しく行われたかどうかはよくわかりませんが、このコードをローカルで実行し、Tomcat にデプロイすると機能します。

残念ながら、Weblogic でこのコードを実行する必要があるため、奇妙な例外が発生します。

Caused by: javax.wsdl.WSDLException: WSDLException: faultCode=PARSER_ERROR: org.w3c.dom.DOMException: HIERARCHY_REQUEST_ERR: An attempt was
made to insert a node where it is not permitted.
        at org.apache.cxf.wsdl11.WSDLManagerImpl.loadDefinition(WSDLManagerImpl.java:235)
        at org.apache.cxf.wsdl11.WSDLManagerImpl.getDefinition(WSDLManagerImpl.java:186)
        at org.apache.cxf.wsdl11.WSDLServiceFactory.<init>(WSDLServiceFactory.java:92)
        ... 26 more
Caused by: org.w3c.dom.DOMException: HIERARCHY_REQUEST_ERR: An attempt was made to insert a node where it is not permitted.
        at com.sun.org.apache.xerces.internal.dom.ParentNode.internalInsertBefore(ParentNode.java:356)
        at com.sun.org.apache.xerces.internal.dom.ParentNode.insertBefore(ParentNode.java:284)
        at com.sun.org.apache.xerces.internal.dom.CoreDocumentImpl.insertBefore(CoreDocumentImpl.java:399)
        at com.sun.org.apache.xerces.internal.dom.NodeImpl.appendChild(NodeImpl.java:235)
        at org.apache.cxf.staxutils.StaxUtils.readDocElements(StaxUtils.java:1019)
        at org.apache.cxf.staxutils.StaxUtils.readDocElements(StaxUtils.java:939)
        at org.apache.cxf.staxutils.StaxUtils.read(StaxUtils.java:866)
        at org.apache.cxf.wsdl11.WSDLManagerImpl.loadDefinition(WSDLManagerImpl.java:226)
        ... 28 more

これは、アプリケーションの展開中に発生します。.wsdl ファイルに何か問題があるようですが、待ってください... Tomcat で動作していました。

JRockit VM と標準の JVM を使用する Weblogic 内の com.sun.org.apache.xerces.* クラスの実装に多少の違いがあると思いますが、それを解決する方法がわかりません。

クライアント作成のさまざまな方法を試すのに何時間も費やしました。それらのほとんどはローカルおよび Tomcat で動作しましたが、WebLogic では動作しませんでした。

次に何を試すべきかヒントはありますか?私はこのトピックにちょっとうんざりしています:D

4

1 に答える 1

3

問題が Xerces の使用バージョンに関連しているというあなたの疑いに同意します。スタックトレースは、Apache Xerces の派生物である Xerces の Sun 実装があなたのケースで使用されていることを示しています。

WebLogic に関連するApache CFX アプリケーション サーバー構成ガイドの手順を確認してください。

WebLogic ClassLoading

WebLogic Server では、システム クラスパスに存在する .jar ファイルはすべて、WebLogic Server システム クラスローダによってロードされます。サーバー インスタンス内で実行されるすべてのアプリケーションは、システム クラスローダの子であるアプリケーション クラスローダにロードされます。システム クラスローダのこの実装では、アプリケーションは、システム クラスローダにすでに存在するサードパーティの jar の異なるバージョンを使用できません。すべての子クラスローダは親 (システム クラスローダ) に特定のクラスを要求し、親から見えるクラスをロードできません。

たとえば、com.foo.Baz というクラスが $CLASSPATH とアプリケーション EAR の両方に存在する場合、EAR からのクラスではなく、$CLASSPATH からのクラスがロードされます。weblogic.jar は $CLASSPATH にあるため、アプリケーションはどの WebLogic Server クラスもオーバーライドできません。

Xerces の代替バージョンを使用するには、FilteringClassLoader を作成する必要があります。

FilteringClassLoader の使用

FilteringClassLoaderは、デプロイメント記述子を構成して、特定のパッケージをシステム クラスローダーによってロードするのではなく、常にアプリケーションからロードする必要があることを明示的に指定するためのメカニズムを提供します。これにより、Xerces や Ant などの代替バージョンのアプリケーションを使用できます。

FilteringClassLoader は、アプリケーション クラスローダーとシステムの間に位置します。これは、システム クラスローダの子であり、アプリケーション クラスローダの親です。FilteringClassLoader は loadClass(String className) メソッドをインターセプトし、className を weblogic-application.xml ファイルで指定されたパッケージのリストと比較します。

結論として、 Apache CFX アプリケーション サーバー構成ガイドに記載されている手順を確認し、org.apache.xerces.*パッケージがシステム クラスローダーからではなく、アプリケーションから読み込まれることを明示的に指定するように注意してください。

たとえば、META-INF の weblogic-application.xml ファイルは次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<weblogic-application xmlns="http://www.bea.com/ns/weblogic/90">
    <application-param>
        <param-name>webapp.encoding.default</param-name>
        <param-value>UTF-8</param-value>
    </application-param>
    <prefer-application-packages>
        <package-name>javax.jws.*</package-name>
        <package-name>org.apache.xerces.*</package-name>
    </prefer-application-packages>
</weblogic-application>

これが役立つことを願っています。

于 2013-01-27T17:35:58.203 に答える