Ссылки на документацию, которые вы опубликовали, на самом деле содержат необходимую информацию, хотя не сразу понятно, как применить ее к Camel.
Документация CXF гласит:
Объект CXF org.apache.cxf.ws.addressing.impl.AddressingPropertiesImpl может использоваться для управления многими аспектами WS-адресации, включая Reply-To:
AddressingProperties maps = new AddressingPropertiesImpl();
EndpointReferenceType ref = new EndpointReferenceType();
AttributedURIType add = new AttributedURIType();
add.setValue("http://localhost:9090/decoupled_endpoint");
ref.setAddress(add);
maps.setReplyTo(ref);
maps.setFaultTo(ref);
((BindingProvider)port).getRequestContext()
.put("javax.xml.ws.addressing.context", maps);
Обратите внимание, что он устанавливает свойства адресации в RequestContext.
Документация Apache Camel гласит:
Как распространить контекст запроса и ответа конечной точки camel-cxf
Клиентский API CXF предоставляет способ вызова операции с контекстом запроса и ответа. Если вы используете производителя конечных точек camel-cxf для вызова внешнего веб-сервиса, вы можете установить контекст запроса и получить контекст ответа с помощью следующего кода:
CxfExchange exchange = (CxfExchange)template.send(getJaxwsEndpointUri(), new Processor() {
public void process(final Exchange exchange) {
final List<String> params = new ArrayList<String>();
params.add(TEST_MESSAGE);
// Set the request context to the inMessage
Map<String, Object> requestContext = new HashMap<String, Object>();
requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, JAXWS_SERVER_ADDRESS);
exchange.getIn().setBody(params);
exchange.getIn().setHeader(Client.REQUEST_CONTEXT , requestContext);
exchange.getIn().setHeader(CxfConstants.OPERATION_NAME, GREET_ME_OPERATION);
}
});
В приведенном выше примере есть некоторые вещи, которые нам не нужны, но важно то, что он показывает нам, как установить контекст запроса CXF.
Соедините их вместе, и вы получите:
@Override
public void process(Exchange exchange) throws Exception {
AttributedURIType messageIDAttr = new AttributedURIType();
messageIDAttr.setValue("customValue");
AddressingProperties maps = new AddressingProperties();
maps.setMessageID(messageIDAttr);
Map<String, Object> requestContext = new HashMap<>();
requestContext.put(JAXWSAConstants.CLIENT_ADDRESSING_PROPERTIES, maps);
exchange.getIn().setHeader(Client.REQUEST_CONTEXT, requestContext);
}
// org.apache.cxf.ws.addressing.JAXWSAConstants.CLIENT_ADDRESSING_PROPERTIES = "javax.xml.ws.addressing.context"
// org.apache.cxf.endpoint.Client.REQUEST_CONTEXT = "RequestContext"
Предупреждение. На своем маршруте я последовательно вызываю несколько различных веб-сервисов. Я обнаружил, что после установки RequestContext, как показано выше, Camel начал использовать один и тот же RequestContext для всех веб-служб, что привело к ошибке: «Заголовок, представляющий свойство адресации сообщения, недействителен, и сообщение не может быть обработано». Это связано с тем, что неправильный заголовок «Действие» использовался для всех вызовов веб-службы после первого.
Я проследил это до Apache Camel, используя «RequestContext» Свойство Exchange , отдельное от установленного нами заголовка, который, очевидно, имеет приоритет над заголовком. Если я удалю это свойство до вызова последующих веб-служб, CXF автоматически заполнит правильный заголовок действия.