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
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
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);
}
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.
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 –
@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
'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. –
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();
}
}
Współpracuje z wyjątkiem, że moje wewnętrzne elementy są bez namespace prefix - tak:
Connections? Czy chodziło ci o prośby? Więc tak, to możliwe. –
tak, prośby, jeśli tak, jak :)? – Trind
Interceptory CXF to kolejna opcja. http://stackoverflow.com/a/16743238/1030409 – Patrick