代码之家  ›  专栏  ›  技术社区  ›  Lars Andren

使用metro,向客户端添加mtomfeature会导致mimeparsingException,为什么?

  •  1
  • Lars Andren  · 技术社区  · 14 年前

    我们有一个支持MTOM的Web服务,它与Grails和Metro1.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传输?

    如果有任何帮助/建议,我将不胜感激!

    1 回复  |  直到 14 年前
        1
  •  1
  •   Lars Andren    14 年前

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

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