14

Webサービスにアクセスするためのクライアントjarファイルを作成しようとしています。クライアントのWebサービス呼び出しを行うサーブレット/warにjarを含めています。次のエラーが発生します。

INFO: 2011 Apr 14 14:57:32,780 MDT [http-thread-pool-8181(4)] ERROR     my.package.ClientServlet - Caught exception
java.lang.ClassCastException: com.sun.xml.ws.client.sei.SEIStub cannot be cast to org.apache.cxf.frontend.ClientProxy
at org.apache.cxf.frontend.ClientProxy.getClient(ClientProxy.java:93)
at my.package.Client.<init>(Client.java:54)
at my.package.ClientServlet.testService(TestServlet.java:118)

私はこの投稿に出くわしましたhttp://yaytay.wordpress.com/2010/03/06/lsned-29-persuading-jdk-6-to-use-cxf-classes-rather-than-its-own-avoiding-seistub /cxf-rt-frontend-jaxwsこれは、依存関係として含める必要のある問題を修正するためのものです。だから、それは私の場合の問題/解決策ではありません。

私のクライアントjarpomには、次の依存関係があります。

<properties>
    <cxf.version>2.3.3</cxf.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-frontend-jaxws</artifactId>
        <version>${cxf.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-ws-security</artifactId>
        <version>${cxf.version}</version>
    </dependency>
</dependencies>

サーブレットwarのlibには次のものが含まれています。

asm-3.3.jar
bcprov-jdk15-1.45.jar
commons-logging-1.1.1.jar
cxf-api-2.3.3.jar
cxf-common-schemas-2.3.3.jar
cxf-common-utilities-2.3.3.jar
cxf-rt-bindings-soap-2.3.3.jar
cxf-rt-bindings-xml-2.3.3.jar
cxf-rt-core-2.3.3.jar
cxf-rt-databinding-jaxb-2.3.3.jar
cxf-rt-frontend-jaxws-2.3.3.jar
cxf-rt-frontend-simple-2.3.3.jar
cxf-rt-ws-addr-2.3.3.jar
cxf-rt-ws-security-2.3.3.jar
cxf-tools-common-2.3.3.jar
geronimo-javamail_1.4_spec-1.7.1.jar
jaxb-impl-2.1.13.jar
log4j-1.2.14.jar
neethi-2.0.4.jar
my-client-cxf-1.0.jar
serializer-2.7.1.jar
slf4j-api-1.4.2.jar
slf4j-log4j12-1.4.2.jar
stax2-api-3.0.2.jar
woodstox-core-asl-4.0.8.jar
wsdl4j-1.6.2.jar
wss4j-1.5.11.jar
xalan-2.7.1.jar
xml-resolver-1.2.jar
XmlSchema-1.4.7.jar
xmlsec-1.4.4.jar

また、ファイルについて説明しているいくつかの投稿を読みましたが、javax.xml.ws.spi.Providerファイルの名前、包含、および配置の詳細を示す参照を見つけることができませんでした。

誰かが私を正しい方向に向けることができますか?

4

7 に答える 7

8

解決策は、war WEB-INFにsun-web.xml(またはglassfish-web.xml)ファイルを含めることでした。GlassfishでMetroを介してCXFを選択する方法を参照してください

編集

glassfish-web.xmlの内容:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE sun-web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Application Server 9.0 Servlet 2.5//EN' 
    'http://www.sun.com/software/appserver/dtds/sun-web-app_2_5-0.dtd'>

<glassfish-web-app>
    <!-- Need this to tell Glassfish not to load the JAX-WS RI classes so it will 
        use the CXF ones instead -->
    <class-loader delegate="false" />
</glassfish-web-app> 
于 2011-12-07T21:55:21.297 に答える
4

ビルドパスからJAX-WSライブラリを削除します。これにより、(ClassCastException)SEIStubからClientProxyへの問題を解決できます。

于 2014-09-19T02:27:10.663 に答える
3

他のすべてが失敗した場合は、リフレクションを使用してサービスのデリゲートをオーバーライドできます。

        QName qName = new QName(wsTargetNamespace, wsName);
        service = new YourServiceScheduler(loc, qName);
        Field delegateField = Service.class.getDeclaredField("delegate");
        delegateField.setAccessible(true);
        ServiceDelegate previousDelegate = (ServiceDelegate)delegateField.get(service);
        if(!previousDelegate.getClass().getName().contains("cxf")) {
            ServiceDelegate serviceDelegate = ((Provider) Class.forName("org.apache.cxf.jaxws.spi.ProviderImpl").newInstance())
                .createServiceDelegate(loc, qName, service.getClass());
            log.info("The " + getClass().getSimpleName() + " delegate is changed from " + "[" + previousDelegate + "] to [" +
                serviceDelegate +
                "]");
            delegateField.set(service, serviceDelegate);
        }
        port = service.getYourServiceSoap();
于 2015-08-08T10:39:00.440 に答える
3

アプリケーションをJava11にアップグレードしているときにこの問題が発生しました。最終的に、いくつかの奇妙な依存関係のセットアップと2つの「競合する」ライブラリがあることがわかりました。

cxf-rt-frontend-simpleとcxf-rt-frontend-jaxws

だから私はすべての単純な依存関係を削除し、それらをjaxwsに置き換えました、そして今はすべてうまくいきます->

<dependency>
 <groupId>org.apache.cxf</groupId>
 <artifactId>cxf-rt-frontend-jaxws</artifactId>
 <version>${cxf.version}</version>
</dependency>

このブログ投稿のクレジット-> http://www.littlebigextra.com/exception-how-to-resolve-com-sun-xml-internal-ws-client-sei-seistub-cannot-be-cast-to-org -apache-cxf-frontend-clientproxy /

詳細については、Java> 8の移行でこのスレッドをお勧めします:非推奨のJPMSモジュールをJavaEEAPIに置き換えます

于 2018-11-14T16:19:15.683 に答える
1

私は過去にCXFを試しましたが、このような奇妙な例外に遭遇しました。すでにCXFメーリングリストを試したことがあると思います。

私はゆっくりと進んでいきます。CFXディストリビューションの実用的な例から始めて、問題が発生するまで一度に1つずつ変更を加えます。

于 2011-04-15T00:56:33.803 に答える
1

コンストラクターを使用する代わりに

Cebbcws ws = new Cebbcws();
CebbcwsPortType wsport = ws.getCebbcwsPort();

を使用してサービスを呼び出すJaxWsProxyFactoryBean

JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.getClientFactoryBean().getServiceFactory().setWsdlURL(Cebbcws.WSDL_LOCATION);
factory.setServiceName(Cebbcws.SERVICE);
factory.setEndpointName(Cebbcws.CebbcwsPort);
CebbcwsPortType wsport = factory.create(CebbcwsPortType.class);

ソース:https ://stackoverflow.com/a/39251733/2686972

于 2019-11-14T11:44:13.097 に答える
0

このエラーは、OpenJdk11でsbt1.3.6に移行するときにも発生しました。

しかし、実際に私は使用していました:

"com.sun.xml.ws" % "jaxws-ri" % "xxx"

そして、apacheのjaxwsに置き換えると、エラーが修正されます。

"org.apache.cxf" % "cxf-rt-frontend-jaxrs" % "3.3.0"
于 2020-01-08T16:48:34.260 に答える