1

我们有一个使用 Grails 和 Metro 1.0.2 插件发布的支持 MTOM 的 Web 服务:

@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
    }
}

按照本教程,我们设置了一个如下所示的 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 传输?

我将非常感谢任何帮助/提示!

4

1 回答 1

1

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

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