2013-04-02 72 views
1

我正在開發使用Apache CXF框架的SOAP Web服務。根據請求參數,我的web方法返回二進制數據或純XML。大多數請求會返回二進制數據,所以我將CXF配置爲在服務響應中使用MTOM。在Apache CXF中動態設置啓用MTOM的屬性

但是這並不總是有用的:當返回XML時,調用者方希望得到純文本/ xml文檔而不是多部分文檔。所以我想讓我的web服務動態地改變它的綁定。

CXF文檔具有下面的例子:

 
Endpoint ep = ...; // example does not explain how to get it 
SOAPBinding binding = (SOAPBinding)ep.getBinding(); 
binding.setMTOMEnabled(true); // or false 

問:我怎樣才能得到Endpoint實例?

我使用Spring註釋@Endpoint用於Web服務,@PayloadRoot用於Web方法。

回答

2

我創建了自己的編組類從org.springframework.oxm.jaxb.Jaxb2Marshaller延長。僅單個方法重寫:

 
public class Marshaller extends Jaxb2Marshaller { 
    @Override 
    public void marshal(Object graph, Result result, MimeContainer mimeContainer) throws XmlMappingException { 
    if (disableMtom()) { 
     super.marshal(graph, result, null); 
    } else { 
     super.marshal(graph, result, mimeContainer); 
    } 
    } 

    private boolean disableMtom() { 
    return ... // depends on response context 
    } 
} 

disableMtom檢測是否MTOM是從響應上下文禁用。 Web服務端點注意將此上下文以某種方式傳遞給編組。

默認情況下啓用MTOM。

2

你可以,如果你正在使用server使用下面的代碼,

你需要添加import javax.xml.ws.Endpoint;

HelloWorldImpl implementor = new HelloWorldImpl(); 
String address = "http://localhost:9000/helloWorld"; 
Endpoint.publish(address, implementor); 

從客戶端

TestMtomService tms = new TestMtomService(wsdlURL, SERVICE_NAME); 
TestMtomPortType port = (TestMtomPortType)tms.getPort(PORT_NAME,TestMtomPortType.class); 
Binding binding = ((BindingProvider)port).getBinding(); 
((SOAPBinding)binding).setMTOMEnabled(true); 

參考

如果您下載了cxf包,代碼示例爲MTOM服務器/上以下路徑

Apache的CXF-2.7.2 \可提供樣品的客戶\ MTOM