CXF - ClassCastException(SEIStub/ClientProxy)
我正在尝试构建一个客户端 jar 文件来访问网络服务。我将 jar 包含在进行客户端 Web 服务调用的 servlet/war 中。我收到以下错误:
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 包含为依赖项,我就是这样做的。所以,这不是我的问题/解决方案。
我的客户端 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>
servlet 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
文件的帖子,但还没有'无法找到任何详细说明其应命名、包含和放置内容的参考资料。
有人能指出我正确的方向吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
解决方案是在 war WEB-INF 中包含 sun-web.xml(或 glassfish-web.xml)文件。请参阅如何在 Glassfish 上选择 CXF 而不是 Metro
编辑
glassfish-web.xml 的内容:
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
EDIT
Contents of glassfish-web.xml:
从构建路径中删除 JAX-WS 库,这样可以解决我的问题,即 (
ClassCastException
) SEIStub 到 ClientProxy。Remove JAX-WS Libraries from buildpath, so this can resolves my problem that is (
ClassCastException
) SEIStub to ClientProxy.如果所有其他方法都失败,您可以使用反射来覆盖服务的委托。
If all else fails, you can use reflection to override the delegate of the service.
我刚刚在将应用程序升级到 Java 11 时遇到了这个问题。最后发现我们有一些奇怪的依赖设置和两个“冲突”的库:
cxf-rt-frontend-simple 与 cxf-rt-frontend-jaxws
所以我删除了所有简单的依赖项并用 jaxws 替换它们,现在一切都很好 ->
归功于这篇博文 -> 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 迁移的线程:用 Java EE API 替换已弃用的 JPMS 模块
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:
cxf-rt-frontend-simple vs. cxf-rt-frontend-jaxws
So I removed all the simple dependencies and replaced them with jaxws and now all is fine ->
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
我过去尝试过 CXF,但遇到过像这样的奇怪异常。我假设您已经尝试过 CXF 邮件列表。
我会尝试慢慢来:从 CFX 发行版的一个工作示例开始,一次进行一项更改,直到解决问题。
I tried CXF in the past and came across strange exceptions like this one. I assume you already tried CXF mailing list.
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.
不使用构造函数
使用
JaxWsProxyFactoryBean
调用服务来源:https://stackoverflow.com/a/39251733/ 2686972
Instead of using constructor
Invoke the service using
JaxWsProxyFactoryBean
Source: https://stackoverflow.com/a/39251733/2686972
使用 OpenJdk 11 迁移到 sbt 1.3.6 时也会发生此错误。
但实际上我使用的是:
并替换为 apache 的 jaxws 修复了错误:
This error also happened while migrating to sbt 1.3.6 with OpenJdk 11.
But acually I was using:
and replacing with apache's jaxws fixes the error: