使用SOAPHandler时MTOM无法正常工作

我尝试使用Mtom传输文件,它工作得很好,直到我使用SoapHandler来validation客户端签名。 SoapHandler保留所有消息并将其更改为base64编码。 因此,当我尝试获取大文件时,Jvm会抛出堆大小exception。 你们知道解决这个问题的方法吗?

Java JRE附带了一个JAX-WS Provider。 这个提供程序有我认为的bug。 如果通过直接获取HandlerChain或使用HandlerResolver添加SoapHandler,则会解构使用MTOM正确创建的消息,并且附件将内联放置在SOAP消息中。 如果附件很大,则可能导致性能极差或内存不足错误。

我发现的唯一解决方案是使用另一个JAX-WS提供程序。 从测试来看,Axis2似乎运行得很好(虽然它有很多依赖项)。 只需在类路径上放置另一个提供程序就可以使用它。 Java在名为javax.xml.ws.spi.Provider的META-INF / services中查找文件。 如果找到此文件,它将使用指定的提供程序。 主Axis2 jar将包含此文件以确保使用Axis2提供程序。 其他提供商也可以解决这个问题。

由于此自动提供程序检测,您可能会发现您的应用程序根据其运行位置确实存在或不存在此问题。 例如,如果您将应用程序部署到IBM WebSphere,它已经覆盖了默认的Provider,您将不会遇到此问题。 可能其他应用程序服务器也覆盖了默认的提供程序。 如果您能获得副本,IBM还提供了一个非常好的jar,com.ibm.jaxws.thinclient_7.0.0.jar,其中包含了Axis2。 这只能用于独立应用程序(那些未在WebSphere中运行的应用程序),但它非常方便并且可以解决此问题。