【问题标题】:Using Metro, adding a MTOMFeature to client side causes a MIMEParsingException, why?使用 Metro,向客户端添加 MTOMFeature 会导致 MIMEParsingException,为什么?
【发布时间】:2010-07-27 08:32:28
【问题描述】:

我们有一个支持 MTOM 的 Web 服务,它与 Grails 和 Metro 1.0.2 插件一起发布:

@MTOM
@WebService(targetNamespace="http://com.domain")
class TestService {

    @WebMethod
    int uploadFile(@XmlMimeType("application/octet-stream")DataHandler data) {

        data.dataSource.inputStream.eachLine {
            println "reading: -> ${it}"
        }
        return 0
    }
}

按照这个tutorial,我们设置了一个看起来像这样的Java测试客户端

public class Client {

    public static void main(String[] argv) {

        MTOMFeature feat = new MTOMFeature();
        TestService service = new TestServiceService().getTestServicePort(feat);
        Map<String, Object> ctxt = ((BindingProvider)service).getRequestContext();
        ctxt.put(JAXWSProperties.HTTP_CLIENT_STREAMING_CHUNK_SIZE, 8192);
        service.uploadFile(new DataHandler(new FileDataSource("c:/file.xml")));
    }
}

当我运行客户端时,我收到以下错误消息:

由于无法创建 SOAP 消息 例外: org.jvnet.mimepull.MIMEParsingException: 缺少起始边界

但是,当我不添加 MTOMFeature 时,只需添加 TestService service = new TestServiceService().getTestServicePort(); 文件上传正常。但据我了解,如果服务器和客户端都未启用 MTOM,则整个文件将保存在内存中(而不是流式传输)。所以,我的问题是

  • 为什么会出现该错误?
  • 如果我不添加 MTOMFeature,文件是否仍然是 MTOM 传输的?

如果有任何帮助/提示,​​我将不胜感激!

【问题讨论】:

    标签: java web-services grails java-metro-framework mtom


    【解决方案1】:

    经过一些研究和测试,答案是:

    • 错误是因为 grails 添加了自己的过滤,包括服务。因此,通过在 UrlMappings.groovy 中像 static excludes = ["/services/*"] 这样将服务排除在过滤之外,它就可以工作了。
    • 没有。如果没有 MTOMFeature,文件将被视为请求中的任何其他数据。这意味着存储在内存中,从而导致大文件出现问题。

    【讨论】:

      猜你喜欢
      • 2016-06-13
      • 2017-01-01
      • 2013-06-21
      • 1970-01-01
      • 1970-01-01
      • 2013-01-25
      • 1970-01-01
      • 2015-09-13
      • 2014-05-05
      相关资源
      最近更新 更多