Значения заголовка в Apache Camel Exchange равны нулю
Ниже приведены мой запрос веб-сервиса, Route и Request-Validator,
Запрос веб-сервиса:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<stlh:SabreHeader xmlns:stlh="http://services.sabre.com/STL_Header/v02_01">
<stlh:Service version="1.0.0">GetHotelMediaRQ</stlh:Service>
<stlh:Identification>
<stlh:CustomerID>CID12345</stlh:CustomerID>
<stlh:CustomerAppID>AppTest</stlh:CustomerAppID>
<stlh:ConversationID>05EFPElI2A4KudU75863JIxqAhQJtAx0</stlh:ConversationID>
<stlh:MessageID>4DTTQaHGSifFUtmSoMHAiq</stlh:MessageID>
<stlh:TimeStamp>2014-11-07T14:45:42.725-06:00</stlh:TimeStamp>
</stlh:Identification>
</stlh:SabreHeader>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:BinarySecurityToken EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" wsu:Id="athId">${athId}</wsse:BinarySecurityToken>
</wsse:Security>
</soap:Header>
<soap:Body>
<GetHotelMediaRQ xmlns="http://services.sabre.com/hotel/media/v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0.0" xsi:schemaLocation="http://services.sabre.com/hotel/media/v1 GetHotelMediaRQ.xsd">
<HotelRefs>
<HotelRef HotelCode="184769" CodeContext="Sabre">
<ImageRef MaxImages="1">
<Images>
<Image Type="ORI"/>
</Images>
<AdditionalInfo>
<Info Type="CAPTION">true</Info>
</AdditionalInfo>
<Languages>
<Language Code="EN"/>
</Languages>
</ImageRef>
</HotelRef>
</HotelRefs>
</GetHotelMediaRQ>
</soap:Body>
</soap:Envelope>
RequestValidator:
public void validate(GetHotelMediaRQ request, Exchange exchange) throws Exception {
TransactionContext context = BusExtensions.getTransactionContext(exchange);
Collection<HotelRef> hotelRefList = getInstance().convert(request, Collection.class);
Set<Property> properties = new HashSet<>();
String customerAppId = exchange.getIn().getHeader("customerAppID", String.class);
String customerId = exchange.getIn().getHeader("customerID", String.class);
Но customerAppId(AppTest) и CustomerId(CI12345) становятся пустыми, когда я пытаюсь получить доступ через объект Exchange.
3 ответа
"Пользовательские" заголовки мыла не копируются в заголовок верблюда. Вы должны вручную добавить мыльный заголовок в заголовок обмена верблюда.
Подход 1)
CamelCxfMessage - вы можете извлечь / обработать пользовательский заголовок мыла сообщение camel cxf, которое присутствует в заголовке обмена верблюдами
в верблюде - SoapMessage soapMessage = (SoapMessage) exchange.getIn (). getHeader ("CamelCxfMessage");
это даст вам сообщение мыла и его soapMessage.getExchange и попытается получить заголовки мыла из сообщения мыла и обработать его.
Подход 2)
Привязка Camel Cxf -Вы можете использовать функцию привязки Camel CXF в определении конечной точки, например, cxfBinding = #bindingName.
Создайте класс и добавьте в него org.apache.camel.component.cxf.DefaultCxfBinding, а имя компонента должно иметь значение bindingName.
у него есть один метод, который вы должны перезаписать - spreadateHeadersFromCxfToCamel (camelmessage, cxfmessage, exchage).
Здесь получите ваш мыльный заголовок и поместите его в заголовок верблюда с идентификатором и заголовок доступа в заголовке обмена верблюда в процессоре или маршрутах с тем же идентификатором.
Я должен был извлечь информацию заголовка, но получил нулевое значение в объекте с первой попытки. затем, через некоторое время, я мог выловить это. вот как (в процессоре):
@Override
public void process(Exchange exc) throws Exception {
@SuppressWarnings("unchecked")
List<SoapHeader> headers = exc.getIn().getHeader(Header.HEADER_LIST, List.class);
for (int i=0; i < headers.size(); i++) {
if (headers.get(i).getObject() instanceof ElementNSImpl) {
ElementNSImpl elementNSImpl = (ElementNSImpl) headers.get(i).getObject();
Node firstChild = elementNSImpl.getFirstChild();
log.trace("header: name=" + elementNSImpl.getLocalName() + ", value=" + firstChild.getNodeValue());
}
}
Установите для ведения журнала org.apache.camel значение DEBUG, и значения заголовков будут записаны, и вы сможете определить, отбрасывает ли их компонент или нет.
Кроме того, похоже, вы используете конечную точку мыла cxf. Посмотрите раздел [Описание параметра relayHeaders] документации здесь: