在 CXF 中应该只有一个带有 Content-ID Exception 的 MIME 附件

There should be exactly one MIME attachment with Content-ID Exception in CXF

当我尝试在需要 MTOM 附加文件的生产环境中使用服务时出现以下错误。

我已经在 CXF 中创建了客户端,并通过以下方式启用了 MTOM。

                        service= new FileTransferService();
                        //service.setHandlerResolver(new JaxWsHandlerResolver());
                        port=service.getFileTransferServicePort();
                        BindingProvider bp = (BindingProvider) port;
                        SOAPBinding binding = (SOAPBinding) bp.getBinding();
                        binding.setMTOMEnabled(true);

我得到的错误是

javax.xml.ws.soap.SOAPFaultException: BEA-382116: There should be exactly one MIME attachment with Content-ID = '3fbc960c-ac11-4bdb-b699-cdda584344a8@http://cxf.apache.org/'.
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:211)
    at com.sun.proxy.$Proxy28.transferFileService(Unknown Source)
    at com.file.transfer.SoaTransfer.transferToWebService(SoaTransfer.java:200)
    at com.file.transfer.SoaTransfer.run(SoaTransfer.java:267)
    at java.lang.Thread.run(Thread.java:767)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:939)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:963)
    at java.lang.Thread.run(Thread.java:767)
Caused by: org.apache.cxf.binding.soap.SoapFault: BEA-382116: There should be exactly one MIME attachment with Content-ID = '3fbc960c-ac11-4bdb-b699-cdda584344a8@http://cxf.apache.org/'.
        at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:70)
        at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:35)
        at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:221)
        at org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:96)
        at org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:65)
        at org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:34)
        at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:221)
        at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:429)
        at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1988)
        at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1824)
        at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:66)
        at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:583)
        at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
        at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:221)
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:276)
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:222)
        at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:73)
        at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:170)
        ... 7 more

但是当我删除我为另一个客户端 WebService 添加的 cxf jar 时,该 WebService 只从主机 WebService 下载文件,该服务工作正常并且文件也被添加并作为附件转发。

以下是我为使服务正常运行而删除的 jar 列表

cxf-2.0.6.jar , geronimo-activation_1.1_spec-1.0.2.jar , geronimo-annotation_1.0_spec-1.1.1.jar , geronimo-javamail_1.4_spec-1.3.jar , jaxb-api-2.0.jar , jaxb-impl-2.0.5.jar , jaxb-xjc-2.0.jar , neethi-3.0.2.jar , spring.jar , stax-utils-20060502.jar , velocity-1.4.jar , velocity-dep-1.4.jar , wsdl4j-1.6.1.jar , wstx-asl-3.2.4.jar , xml-resolver-1.2.jar , XmlSchema-1.4.2.jar

编辑:

请注意我使用的cxf版本是2.0.6

当服务向任何第三方 Web 服务发送带有 MTOM 的附件时,问题出在 cxf 上。因为这个问题:- CXF MTOM producer for third party issue

升级到 CXF 2.7.18 解决了这个问题。