【问题标题】:com.sun.xml.ws.client.ClientTransportException: HTTP transport error: java.lang.ClassCastExceptioncom.sun.xml.ws.client.ClientTransportException:HTTP 传输错误:java.lang.ClassCastException
【发布时间】:2014-02-19 17:31:57
【问题描述】:

我目前正在尝试从 Weblogic 12c 和 Java 7 环境中调用 JAX-WS。我已经使用来自 maven 的 weblogic 客户端生成器插件生成了客户端存根,具体来说:

<b>groupId:com.oracle.weblogic</b><br>
<b>artifactId:weblogic-maven-plugin</b>

客户端 jar 似乎生成良好。我能够在 java 中生成客户端存根,但是当通过将 SOAP 消息发送到服务的存根调用实际 API 时,我得到以下奇怪的异常:

<b>com.sun.xml.ws.client.ClientTransportException: HTTP transport error: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
com.sun.xml.ws.client.ClientTransportException: HTTP transport error: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
        at com.sun.xml.ws.transport.http.client.HttpClientTransport.getOutput(HttpClientTransport.java:131)
        at com.sun.xml.ws.transport.http.client.HttpTransportPipe.process(HttpTransportPipe.java:219)
        at com.sun.xml.ws.transport.http.client.HttpTransportPipe.processRequest(HttpTransportPipe.java:143)
        at com.sun.xml.ws.transport.DeferredTransportPipe.processRequest(DeferredTransportPipe.java:138)
        at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:892)
        at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:841)
        at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:804)
        at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:706)
        at com.sun.xml.ws.client.Stub.process(Stub.java:385)
        at com.sun.xml.ws.client.sei.SEIStub.doProcess(SEIStub.java:189)
        at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:119)
        at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:102)
        at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:172)
        at $Proxy130.getSearchResults(Unknown Source)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:601)
        at weblogic.wsee.jaxws.spi.ClientInstanceInvocationHandler.invoke(ClientInstanceInvocationHandler.java:84)</b>

我在 glassfish 设置下看到了同样的问题 Here

但没有解决办法。

现在我尝试了 SOAP UI,服务从这里响应良好,我尝试使用 weblogic 11g,并且产生了相同的错误。我正在记录在生成异常之前发出的实际 SOAP 消息,并且 xml 是准确的,并且在从 SOAP UI 运行时可以工作。

这可能是什么原因造成的?

谢谢

【问题讨论】:

    标签: java web-services soap


    【解决方案1】:

    我花了几个小时来解决这个问题。我使用了错误的 BindingProviderProperties 接口。

    BindingProviderProperties 接口存在于两个不同的包中。 (针对不同的 Java/JAX-WS 版本)

    如果你得到 ClassCastException 很可能你需要在你的肥皂服务类中导入不同的包。

    改变

    import com.sun.xml.ws.client.BindingProviderProperties;
    

    import com.sun.xml.internal.ws.client.BindingProviderProperties;
    

    【讨论】:

    • 这绝对让我朝着正确的方向前进。我使用字符串值而不是整数值(例如“5000”与 5000)为超时设置 BindingProviderProperties。谢谢!
    • @MartinDevillers 谢谢!我对 Long 值有同样的问题,不得不将 Duration.toMillis() 的返回值转换为 Integer。
    • 如果更改属性的包,错误就会消失,因为内部实现使用了其他属性。避免问题并真正设置超时的正确做法是将属性值作为 int 传递。
    【解决方案2】:

    问题是您正在使用 String 值设置超时属性,但在内部 createHttpConnection() 方法中的类 HttpClientTransport 需要此属性的整数:

    ...
    Integer reqTimeout = (Integer)context.invocationProperties.get(BindingProviderProperties.REQUEST_TIMEOUT);
    if (reqTimeout != null) {
        httpConnection.setReadTimeout(reqTimeout);
    }
    ...
    

    然后,如果您将属性作为String 传递,它会抛出ClassCastException。所以我想你有类似的东西:

    String timeoutInMillis = "30000";
    
    dispatcher.getRequestContext().put(BindingProviderProperties.REQUEST_TIMEOUT, timeoutInMillis);
    dispatcher.getRequestContext().put(BindingProviderProperties.CONNECT_TIMEOUT, timeoutInMillis);
    

    您必须将属性值设置为 int,例如使用 Integer.valueOf(String value):

    String timeoutInMillis = "30000";
    
    dispatcher.getRequestContext().put(BindingProviderProperties.REQUEST_TIMEOUT, Integer.valueOf(timeoutInMillis));
    dispatcher.getRequestContext().put(BindingProviderProperties.CONNECT_TIMEOUT, Integer.valueOf(timeoutInMillis));
    

    或者您也可以将超时定义为int

    int timeoutInMillis = 30000;
    
    dispatcher.getRequestContext().put(BindingProviderProperties.REQUEST_TIMEOUT, timeoutInMillis);
    dispatcher.getRequestContext().put(BindingProviderProperties.CONNECT_TIMEOUT, timeoutInMillis);
    

    【讨论】:

      猜你喜欢
      • 2019-01-23
      • 2011-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多