我正在尝试使用 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 发送到服务器的方法,但没有任何响应(在我的情况下,响应中有错误)。
这又是一种非常“奇怪”的方式。但这一个有效。如果你有更好的,请回答这个问题。
谢谢