java CXF - ClassCastException (SEIStub/ClientProxy)

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/5670343/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-30 12:12:27  来源:igfitidea点击:

CXF - ClassCastException (SEIStub/ClientProxy)

javacxfclasscastexception

提问by sdoca

I'm trying to build a client jar file to access a webservice. I'm including the jar in a servlet/war that makes the client webservice calls. I'm getting the following error:

我正在尝试构建一个客户端 jar 文件来访问 Web 服务。我将 jar 包含在一个 servlet/war 中,它使客户端 web 服务调用。我收到以下错误:

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)

I came across this post http://yaytay.wordpress.com/2010/03/06/lsned-29-persuading-jdk-6-to-use-cxf-classes-rather-than-its-own-avoiding-seistub/which says to fix the problem you need to include cxf-rt-frontend-jaxwsas a dependency, which I do. So, that isn't the problem/solution in my case.

我遇到了这篇文章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作为依赖项包含的问题,我就是这样做的。所以,这不是我的问题/解决方案。

My client jar pom has these dependencies:

我的客户端 jar pom 具有以下依赖项:

<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>

The servlet war contains the following in its lib:

servlet War在其库中包含以下内容:

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

I've also read some posts that talk about a javax.xml.ws.spi.Providerfile, but haven't been able to find any references that detail what it should be named, contain and placed.

我还阅读了一些讨论javax.xml.ws.spi.Provider文件的帖子,但找不到任何详细说明应该命名、包含和放置文件的参考资料。

Can anybody point me in the right direction?

有人能指出我正确的方向吗?

采纳答案by sdoca

The solution was to include a sun-web.xml (or glassfish-web.xml) file in the war WEB-INF. See How to pick CXF over Metro on Glassfish

解决方案是在 war WEB-INF 中包含一个 sun-web.xml(或 glassfish-web.xml)文件。查看如何在 Glassfish 上通过 Metro 选择 CXF

EDIT

编辑

Contents of glassfish-web.xml:

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> 

回答by EpicPandaForce

If all else fails, you can use reflection to override the delegate of the service.

如果所有其他方法都失败了,您可以使用反射来覆盖服务的委托。

        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();

回答by scj

Remove JAX-WS Libraries from buildpath, so this can resolves my problem that is (ClassCastException) SEIStub to ClientProxy.

从构建路径中删除 JAX-WS 库,这样可以解决我的问题,即 ( ClassCastException) SEIStub 到 ClientProxy。

回答by Sasha O

I tried CXF in the past and came across strange exceptions like this one. I assume you already tried CXF mailing list.

我过去尝试过 CXF 并遇到过这样的奇怪异常。我假设您已经尝试过CXF 邮件列表

I would try to go slow: start with a working example from the CFX distribution and make one change at a time until you get to the problem.

我会尽量慢一点:从 CFX 发行版中的一个工作示例开始,一次做一个更改,直到解决问题为止。

回答by deradam

I just had this issue while upgrading our application to Java 11. In the end it turned out that we had some weired dependency setup and two "conflicting" libs:

我刚刚在将我们的应用程序升级到 Java 11 时遇到了这个问题。最后发现我们有一些奇怪的依赖项设置和两个“冲突”的库:

cxf-rt-frontend-simple vs. cxf-rt-frontend-jaxws

cxf-rt-frontend-simple 与 cxf-rt-frontend-jaxws

So I removed all the simple dependencies and replaced them with jaxws and now all is fine ->

所以我删除了所有简单的依赖项并用 jaxws 替换它们,现在一切都很好 - >

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

Credits to this blog post -> 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/

归功于此博客文章 -> 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/

For further reading I recommend this thread on Java >8 migrations: Replacements for deprecated JPMS modules with Java EE APIs

为了进一步阅读,我推荐这个关于 Java > 8 迁移的线程:Replacements for deprecated JPMS modules with Java EE APIs

回答by Pavel Sedek

Instead of using constructor

而不是使用构造函数

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

Invoke the service using JaxWsProxyFactoryBean

使用调用服务 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);

Source: https://stackoverflow.com/a/39251733/2686972

来源:https: //stackoverflow.com/a/39251733/2686972

回答by Bob

This error also happened while migrating to sbt 1.3.6 with OpenJdk 11.

使用 OpenJdk 11 迁移到 sbt 1.3.6 时也会发生此错误。

But acually I was using:

但实际上我正在使用:

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

and replacing with apache's jaxws fixes the error:

并替换为 apache 的 jaxws 修复了错误:

"org.apache.cxf" % "cxf-rt-frontend-jaxrs" % "3.3.0"