【问题标题】:CXF - ClassCastException (SEIStub/ClientProxy)CXF - ClassCastException (SEIStub/ClientProxy)
【发布时间】:2011-08-05 22:25:57
【问题描述】:

我正在尝试构建一个客户端 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)

我遇到了这个帖子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 战争在其库中包含以下内容:

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 文件的帖子,但找不到任何详细说明它应该命名、包含和放置什么的参考资料。

谁能指出我正确的方向?

【问题讨论】:

    标签: java cxf classcastexception


    【解决方案1】:

    解决方案是在战争 WEB-INF 中包含一个 sun-web.xml(或 glassfish-web.xml)文件。见How to pick CXF over Metro on Glassfish

    编辑

    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> 
    

    【讨论】:

    • 我向上帝发誓,如果这对我有用,你就会得到一些赏金;)
    • 您可以发布适合您的 xml 文件吗?或者至少是相关部分?
    • 感谢您的赏金。我很高兴我的回答对其他人有用,因为我从 SO 中找到了许多问题的答案。
    • 有没有办法以编程方式做到这一点?
    【解决方案2】:

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

    【讨论】:

      【解决方案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();
      

      【讨论】:

      • 我正在尝试这个,但我得到:NoSuchField 委托
      • 你确定你使用的是正确的Service.class吗?完全限定名称是javax.xml.ws.Service。我当然希望这个实现细节没有改变
      【解决方案4】:

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

      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 迁移的线程:Replacements for deprecated JPMS modules with Java EE APIs

      【讨论】:

        【解决方案5】:

        我过去尝试过 CXF,遇到了像这样的奇怪异常。我假设你已经尝试过CXF mailing list

        我会尽量放慢速度:从 CFX 发行版中的一个工作示例开始,一次进行一项更改,直到解决问题。

        【讨论】:

          【解决方案6】:

          而不是使用构造函数

          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

          【讨论】:

            【解决方案7】:

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

            但实际上我正在使用:

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

            并用 apache 的 jaxws 替换可以修复错误:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-02-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-02-10
              相关资源
              最近更新 更多