2013-08-30 11 views
6

İstemci tarafındaki tüm giden cxf bağlantılarına bir Üstbilgi eklenebilir mi? Bahar 3.0 ve CXF 2.6.0Add Header Tüm giden CXF isteğine

+1

Bağlantıları? Istekleri mi demek istediniz? O zaman evet, mümkün. –

+0

evet istekleri, eğer öyleyse nasıl :)? – Trind

+1

CXF Interceptors başka bir seçenektir. http://stackoverflow.com/a/16743238/1030409 – Patrick

cevap

1

bu ben yaptım nasıl olduğunu

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"/> 

keseni: Burada benim iki sent vermek istiyorum

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

kullanma

Zaten bunu yapmanın iki yolu biliyorum. Bunlardan biri, SOAP İşleyicinizi oluşturmak ve Spring yapılandırmanıza JAX-WS işleyici olarak kaydetmektir.

Bir SOAP işleyicisi nasıl oluşturulur my answer here denetleyin. Eğer ileti giden olup olmadığını kontrol etmek gerektiğini unutmayın tepki (giden istek) görünmesini başlık istiyorum gibi, böyle bir şey yapacağını:

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

diğer belki daha kolay bir yol. Başlığı doğrudan CXF yanıt içeriğine yerleştirin. Lütfen bu örneğin sadece kavramların ispatı olduğunu unutmayın, yanıtta kimlik bilgilerine ihtiyacınız olan gerçekte durumu bilmiyorum. Kullanıcı kimlik bilgisi nesnesinin üstbilgiye nasıl eklendiğini gösterecek, gereksinimlerinize bağlı olarak bunu değiştirmeniz gerekir.

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); 
} 

Bu yöntemin, istemcinizin isteği üzerine hemen çağrılması gerekir.

+2

Üzgünüz, bu iletinin uzun bir süre önce gönderildiğini biliyorum, ancak burada proxy nesnesi nedir? Nereden geldi? Teşekkürler –

+0

@AliH Geçerli bir soru. Proxy'nin WebServiceContext'e enjekte edildiğini düşünüyorum. @Resource özel WebServiceContext proxy; Bu https://cxf.apache.org/faq.html#FAQ-HowcanIaddsoapheaderstotherequest/response konusuna bakın. – Nikhil

+1

'proxy', [Hizmet] (https://docs.oracle.com/javase/7/docs/api/javax/xml/ws/Service.html) sınıfından gelen web hizmetinin bağlantı noktası türünün bir örneğidir. Örneğin: 'Service service = Service.create (url, qname); YourWebService proxy = service.getPort (YourWebService.class); URL'leri burada yayınladığınız URL ve qname, oluşturulan hizmet sınıfı ile bir ad alanı eşlemesidir. –

5

. Yazımın burada aynı durumda çözmede am -

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

Bahar Yapılandırma: -

<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 keseni -

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

O benim iç unsurlar ad öneki olmadan olması dışında çalışıyor - böyle: Herhangi biri yardım edebilir mi? – Fenix