我正在尝试从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文件。
我错过了什么吗?
答案 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发送附件非常简单:只需使用
注释Web服务实现类javax.xml.ws.soap.MTOM