1

我正在尝试使用 JAX-WS RI 编写 web 服务。此服务包含附件并带有注释

@MTOM

我还编写了检查 ws-security usernameToken 的处理程序。当登录名/密码不正确时,处理程序会生成错误并将其返回给客户端。我正在尝试在客户端启用 mtom:

((SOAPBinding)service).getBinding().setMTOMEnabled(true);

最后我收到异常:

Exception in thread "main" javax.xml.ws.WebServiceException: Missing Start Boundary, or boundary does not start on a new line
        at com.sun.xml.ws.encoding.MimeMultipartParser.getNextPart(MimeMultipartParser.java:148)
        at com.sun.xml.ws.encoding.MimeMultipartParser.getRootPart(MimeMultipartParser.java:89)
        at com.sun.xml.ws.encoding.SOAPBindingCodec.decode(SOAPBindingCodec.java:303)
        at com.sun.xml.ws.encoding.MimeCodec.decode(MimeCodec.java:116)
        at com.sun.xml.ws.encoding.SOAPBindingCodec.decode(SOAPBindingCodec.java:253)
        at com.sun.xml.ws.transport.http.client.HttpTransportPipe.process(HttpTransportPipe.java:152)
        at com.sun.xml.ws.transport.http.client.HttpTransportPipe.processRequest(HttpTransportPipe.java:74)
        at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:559)
        at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:518)
        at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:503)
        at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:400)
        at com.sun.xml.ws.client.Stub.process(Stub.java:228)
        at com.sun.xml.ws.client.sei.SEIStub.doProcess(SEIStub.java:120)
        at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:226)
        at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:206)
        at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:103)
        at $Proxy28.putContent(Unknown Source)
        at example.HelloWorldClient.main(HelloWorldClient.java:54)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

谁能解释如何解决这个问题?

更新: 研究表明问题出在服务器端:

响应,我从服务器得到的也有包含边界 uuid 的“多部分/相关”类型,但在消息中这个 uuid 是空的。有没有办法使响应不是多部分的,或者设置处理程序以正确使用它?

更新: 终于找到了解决方案(这不是最佳方法,但目前这个方法有效):我不知道如何在 SoapHandler(javax.xml.ws.handler.soap.SOAPHandler)中禁用多部分,但 SOAPMessageContext 有对 HttpServletResponse 的引用,您可以在其中写入您拥有的任何数据。不要忘记关闭OutputStream,并在handleMessage方法中返回false。您还需要设置正确的 CotnentType。此 hack 适用于将 attachemtn 发送到服务器的方法,但没有任何响应(在我的情况下,响应中有错误)。

这又是一种非常“奇怪”的方式。但这一个有效。如果你有更好的,请回答这个问题。

谢谢

4

0 回答 0