2013-08-30 26 views
6

Có thể thêm Tiêu đề cho tất cả các kết nối cxf gửi đi, từ phía máy khách hay không.Thêm tiêu đề Để tất cả yêu cầu CXF gửi đi

Sử dụng Spring 3.0 và CXF 2.6.0

+1

Connections? Ý bạn là yêu cầu? Sau đó, yeah, nó có thể. –

+0

vâng yêu cầu, nếu vậy làm thế nào :)? – Trind

+1

Máy đánh chặn CXF là một lựa chọn khác. http://stackoverflow.com/a/16743238/1030409 – Patrick

Trả lời

1

đây là cách tôi đã làm,

Spring.xml

<import resource="classpath:META-INF/cxf/cxf.xml" /> 

<bean id="cxf" class="org.apache.cxf.bus.spring.SpringBus"> 
    <property name="outInterceptors"> 
     <list> 
      <ref bean="headerInterceptor"/> 
     </list> 
    </property> 
    <property name="inInterceptors"> 
     <list> 
      <ref bean="headerInterceptor"/> 
     </list> 
    </property> 
</bean> 

<bean id="headerInterceptor" class="logging.Interceptor"/> 

Interceptor:

public class UUIDHeaderInterceptor extends AbstractPhaseInterceptor { 


private static final Logger logger = LoggerFactory.getLogger(UUIDHeaderInterceptor.class); 



public UUIDHeaderInterceptor() { 
    super(Phase.RECEIVE); 

} 

@Override 
public void handleMessage(Message message) throws Fault { 

     Map<String, List<String>> headers = (Map<String, List<String>>) message.get(Message.PROTOCOL_HEADERS); 
     headers.put(REQUEST_ID_ATTRIBUTE_NAME, Arrays.asList(new String[]{"TEST"})); 

    } 
} 

@Override 
public void handleFault(Message message) { 
    handleMessage(message); 
    } 
2

Tôi đã biết hai cách để thực hiện việc này. Một là tạo trình xử lý SOAP của bạn và đăng ký nó như là trình xử lý JAX-WS trong cấu hình Spring của bạn.

Kiểm tra my answer here cách tạo trình xử lý SOAP. Như bạn muốn tiêu đề xuất hiện trong phản ứng (yêu cầu đi) đừng quên rằng sau đó bạn cần phải kiểm tra xem các thông điệp được gửi đi, một cái gì đó như thế này sẽ làm:

Boolean outbound = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); 
if (outbound) { 
    //Modify your header. 
} 

Các khác, cách thể dễ dàng hơn. Đặt tiêu đề trực tiếp vào bối cảnh phản hồi CXF. Xin lưu ý rằng ví dụ này chỉ là bằng chứng về khái niệm, tôi không biết tình hình trong thực tế khi bạn cần thông tin đăng nhập trong phản hồi. Nó sẽ hiển thị cách thêm đối tượng thông tin người dùng vào tiêu đề, bạn phải sửa đổi nó tùy thuộc vào nhu cầu của bạn.

private void modifyResponse(String username, String password) { 
    UserCredentials authHeader = new UserCredentials(); 
    authHeader.setUsername(username); 
    authHeader.setPassword(password); 
    ArrayList<Header> headers = new ArrayList<Header>(1); 
    try { 
     Header soapHeader = new Header(
       new QName("http://yournamespaceuri.com/something", "UserCredentials"), 
       authHeader, 
       new JAXBDataBinding(UserCredentials.class)); 
     headers.add(soapHeader); 
    } catch (JAXBException ex) { 
     LOGGER.error("Exception trying to serialize header: {}", ex); 
    } 
    ((BindingProvider) proxy).getResponseContext().put(Header.HEADER_LIST, headers); 
} 

Phương pháp này cần được gọi ngay sau khi yêu cầu khách hàng của bạn.

+2

xin lỗi, tôi nhận thấy thông báo này đã được đăng một thời gian dài trước đây, nhưng đối tượng proxy ở đây là gì? Nó từ đâu đến? Cảm ơn –

+0

@AliH Đó là câu hỏi hợp lệ. Tôi nghĩ proxy được tiêm WebServiceContext, ví dụ: '@Resource WebService riêngĐiện thoại proxy tiếp theo;' Tham khảo https://cxf.apache.org/faq.html#FAQ-HowcanIaddsoapheaderstotherequest/response này? – Nikhil

+1

'proxy' là một thể hiện của loại cổng dịch vụ web xuất phát từ lớp [Service] (https://docs.oracle.com/javase/7/docs/api/javax/xml/ws/Service.html). Ví dụ: 'Dịch vụ dịch vụ = Service.create (url, qname); YourWebService proxy = service.getPort (YourWebService.class); ' Nơi url được bạn xuất bản URL điểm cuối và qname là ánh xạ vùng tên với lớp dịch vụ được tạo. –

5

tôi muốn cung cấp cho hai xu của tôi ở đây. Tôi giải quyết những trường hợp tương tự ở đây trong bài viết của tôi - Cấu hình

http://saurzcode.in/2014/05/08/adding-header-to-soap-request-using-cxf-2/

mùa xuân: -

<jaxws:client id="mywebServiceClient" 
    serviceClass="com.saurzcode.TestService" 
    address="http://saurzcode.com:8088/mockTestService"> 

    <jaxws:binding> 
     <soap:soapBinding version="1.2" mtomEnabled="true" /> 
    </jaxws:binding> 
</jaxws:client> 
<cxf:bus> 
    <cxf:outInterceptors> 
     <bean class="com.saurzcode.ws.caller.SoapHeaderInterceptor" /> 
    </cxf:outInterceptors> 
</cxf:bus> 

CXF Interceptor -

public class SoapHeaderInterceptor extends AbstractSoapInterceptor { 

    public SoapHeaderInterceptor() { 
     super(Phase.POST_LOGICAL); 
    } 

    @Override 
    public void handleMessage(SoapMessage message) throws Fault { 
     List<Header> headers = message.getHeaders(); 
     TestHeader testHeader = new TestHeader(); 
     JAXBElement<TestHeader> testHeaders = new ObjectFactory() 
     .createTestHeader(testHeader); 

     try { 
      Header header = new Header(testHeaders.getName(), testHeader, 
      new JAXBDataBinding(TestHeader.class)); 
      headers.add(header); 
      message.put(Header.HEADER_LIST, headers); 

     } catch (JAXBException e) { 
      e.printStackTrace(); 
     } 

    } 
+0

Nó hoạt động tốt ngoại trừ việc các yếu tố nội tại của tôi là không có tiền tố namespace - như thế này: Ai đó có thể giúp bạn? – Fenix

Các vấn đề liên quan