JAX-WS MTOM不能在Tomcat上运行,但如果由Endpoint发布则有效

时间:2014-02-10 16:36:25

标签: java web-services soap jax-ws

我正在尝试从JAX-WS / Metro服务器向客户端发送附件。

我有一个标准的Tomcat 7 / JDK 6环境和通过单一操作从WSDL生成的简单项目。

许多指南都说如何配置MTOM,我将base64Binary类型添加到我的响应中,并将@MTOM anotation添加到我的服务实现中。我没有添加任何其他内容。

当我打电话

public static void main (String args[]){
        Endpoint.publish("http://localhost:8080/sampleService", new SampleService()); ;
    }

它工作正常,我看到来自服务器的附件。

现在我想创建一个同样的网络应用程序。

这是我的web.xml的一部分

<listener>
    <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
  </listener>
  <servlet>
    <servlet-name>SampleService</servlet-name>
    <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>SampleService</servlet-name>
    <url-pattern>/SampleService</url-pattern>
  </servlet-mapping>

我下载了jaxws-ri依赖项并将它们放在Tomcat / lib文件夹中。 还在WEB-INF目录中创建了以下sun-jaxws.xml:

<?xml version="1.0" encoding="UTF-8"?>
<endpoints
    xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime"
    version="2.0">

    <endpoint
        name="SampleService"
        implementation="com.example.SampleService"
        url-pattern="/SampleService"
        mtom-enabled="true"
         />

</endpoints>

注意启用mtom的属性。

然后我部署它并且它可以工作,但是MTOM不起作用,响应包含内联的Base64编码的二进制数据而不是附件。 代码完全相同,不同之处仅在于运行它以及其他web.xml和sun-jaxws.xml文件。

我错过了什么吗?

2 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,最终我可以解决它,在我的情况下,MTOM被禁用,因为自定义处理程序对肥皂消息进行了序列化,而当我使用直接jax-ws服务时,该消息不会被调用。 因此,请尝试禁用所有实现LogicalHandler和SOAPHandler 在我们的案例中,我们在Web服务配置中设置了处理程序:

final SpringService springService = new SpringService();
springService.setBean(endpoint);
springService.setHandlers(getHandlers());

其中getHandlers是私有列表getHandlers();

希望对您有帮助。

答案 1 :(得分:-1)

这可能会有所帮助: http://www.mkyong.com/webservices/jax-ws/jax-ws-attachment-with-mtom/ 它说:

  

启用服务器通过MTOM发送附件非常简单:只需使用javax.xml.ws.soap.MTOM

注释Web服务实现类