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
CXF - ClassCastException (SEIStub/ClientProxy)
提问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-jaxws
as 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.Provider
file, 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/
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);
回答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"