我尝试使用MTOM传输文件,它是工作相当不错,直到我用SoapHandler来验证客户签名。 SoapHandler保留所有消息,并将其更改为base64编码。 所以,当我试图让巨大的文件,JVM发出堆大小异常。 难道你们知道解决这个问题的任何方式?
Answer 1:
在Java JRE配备了JAX-WS提供者。 此汇市我会考虑的一个错误。 如果一种SOAPHandler加入,或者通过直接获取HandlerChain的或通过使用HandlerResolver,消息,将其正确使用MTOM创建,解构和附件(多个)在SOAP消息内的内联放置。 如果附件很大,这可能会导致性能非常差或内存不足的错误。
我发现的唯一的解决方案是使用另一个JAX-WS提供。 从测试中,Axis2的似乎完美地工作(尽管它有依赖关系的一个巨大的数字)。 简单地把其他供应商的类路径将导致其使用。 java查找名为javax.xml.ws.spi.Provider在META-INF /服务的文件。 如果找到这个文件,它会使用指定的供应商。 主要Axis2的罐子将包括此文件,以确保Axis2的供应商使用。 其他供应商也可以解决这个问题。
由于这种自动提供检测,你会发现你的应用程序或不依赖于它运行的位置不会有这个问题。 例如,如果将应用程序部署到IBM的WebSphere它已经覆盖了默认提供者,你不会有这个问题。 可能其他应用服务器也覆盖默认提供商。 如果你能得到阿霍德副本,IBM还提供了一个非常漂亮的罐子,com.ibm.jaxws.thinclient_7.0.0.jar,已经Axis2的包装在里面。 这只能用于独立的应用程序(那些在WebSphere不运行),但它是非常方便,解决了这个问题。
文章来源: MTOM not working when using SOAPHandler