2012-08-17 64 views
1

我尝试使用Mtom传输文件,直到我使用SoapHandler验证客户端签名为止它工作得很好。 SoapHandler保留所有消息并将其更改为base64编码。所以当我尝试获取大文件时,JVM会抛出堆大小异常。你们有没有办法解决这个问题?使用SOAPHandler时MTOM不起作用

+0

这并不严格回答你的问题,但是有可能使用REST服务而不是SOAP?我问,因为几年前,我花了很长时间试图让MTOM处理大型二进制文件,最终放弃了。后来,我意识到不是试图将二进制对象放入SOAP信封中,而是将该文件表示为URI并将其作为响应流返回。 – Ickster 2012-09-17 12:58:24

回答

2

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

我发现的唯一解决方案是使用另一个JAX-WS提供程序。从测试中,Axis2似乎完美地工作(虽然它有大量的依赖关系)。简单地将另一个提供者放在类路径上会导致它被使用。 Java在META-INF/services中查找名为javax.xml.ws.spi.Provider的文件。如果找到该文件,它将使用指定的提供程序。主Axis2 jar将包含该文件以确保使用Axis2提供程序。其他提供商也可能解决这个问题。

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

相关问题