2013-08-30 20 views
6

Czy jest możliwe dodanie nagłówka do wszystkich wychodzących połączeń cxf od strony klienta.Dodaj nagłówek do wszystkich wychodzących żądań CXF

Korzystanie Wiosna 3.0 i CXF 2.6.0

+1

Connections? Czy chodziło ci o prośby? Więc tak, to możliwe. –

+0

tak, prośby, jeśli tak, jak :)? – Trind

+1

Interceptory CXF to kolejna opcja. http://stackoverflow.com/a/16743238/1030409 – Patrick

Odpowiedz

1

to jak ja,

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

już wiem dwa sposoby robienia tego. Jedną z nich jest utworzenie programu obsługi SOAP i zarejestrowanie go jako programu obsługi JAX-WS w konfiguracji Spring.

Sprawdź, czy utworzyć procedurę obsługi protokołu SOAP na temat: my answer here. Jak chcesz się pojawiać w nagłówku odpowiedzi (wniosek ustępującego) nie zapominać, że wtedy trzeba sprawdzić, czy wiadomość jest wychodzące, coś jak to zrobi:

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

drugiej strony, być może bardziej łatwiejszy sposób. Umieść nagłówek bezpośrednio w kontekście odpowiedzi CXF. Zwróć uwagę, że ten przykład jest tylko dowodem koncepcji, nie znam sytuacji w rzeczywistości, w której potrzebujesz referencji w odpowiedzi. Pokaże, jak dodać obiekt poświadczeń użytkownika do nagłówka, musisz go zmodyfikować w zależności od potrzeb.

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

Ta metoda musi zostać wywołana zaraz po żądaniu klienta.

+2

Przepraszam, zdaję sobie sprawę, że ta wiadomość została opublikowana dawno temu, ale jaki jest tutaj obiekt proxy? Skąd się to wzięło? Dzięki –

+0

@AliH To jest poprawne pytanie. Myślę, że proxy jest wstrzykiwany WebServiceContext np. '@Resource prywatny serwer proxy WebServiceContext;' Odwołaj się do https://cxf.apache.org/faq.html#FAQ-HowcanIaddsoapheaderstothequest/response? – Nikhil

+1

'proxy' jest instancją typu portu usługi WWW pochodzącą z klasy [Service] (https://docs.oracle.com/javase/7/docs/api/javax/xml/ws/Service.html). Na przykład: 'Usługa serwisowa = Service.create (url, qname); YourWebService proxy = service.getPort (YourWebService.class); ' Gdzie adres URL punktu końcowego jest publikowany, a qname to mapowanie przestrzeni nazw z wygenerowaną klasą usług. –

5

chciałbym dać moje dwa centy tutaj. Mam rozwiązanie tej samej sprawy w moim poście -

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

Wiosna Konfiguracja: -

<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

Współpracuje z wyjątkiem, że moje wewnętrzne elementy są bez namespace prefix - tak: Czy ktokolwiek mógłby pomóc? – Fenix

Powiązane problemy