Получить SOAPMessage от org.apache.camel.Exchange

Мне нужно получить сообщение SOAP от объекта обмена, который я получаю в своем весеннем компоненте.

У меня есть верблюжий маршрут, который маршрутизирует от конечной точки службы до моего Java-бина. Маршрут Java Bean и Camel, объявленный весной, выглядит следующим образом:

<bean id="processor" class="com.groupgti.esb.camel.wrapper.gradireland.userregistration.UserRegistrationProcessor">

<camel:route id="route">
    <camel:from uri="cxf:bean:myListenerEndpoint?dataFormat=PAYLOAD&amp;synchronous=true" />
    <camel:bean ref="processor" />
    <camel:to uri="cxf:bean:myTargetEndpoint"/>
</camel:route>

В моем java bean я получаю объект обмена:

@Override
public SOAPMessage processMessage(Exchange exchange) {
    Object object = exchange.getIn().getHeaders().get("CamelCxfMessage");
    LOGGER.debug("Object: " + object);
    SOAPMessage message = null;

    if (object instanceof SOAPMessage) {
        message = (SOAPMessage) object;
        LOGGER.debug("Got message: " + message);
    }

    LOGGER.debug("Sending message...");
    return message;
}

Проблема в том, что я не могу получить сообщение SOAP из обмена. Я веб-сайт верблюда, здесь я обнаружил, что должен использовать это, чтобы получить сообщение SOAP :

SOAPMessage soapMessage = (SOAPMessage) exchange.getIn().getBody(List.class).get(0);

Но он дает мне NullPointerException где-то глубоко в обмен.

Я попытался отладить и увидеть дерево объектов. Я обнаружил, что могу получить такое сообщение:

SOAPMessage soapMessage = (SOAPMessage) exchange.getIn().getHeaders().get("CamelCxfMessage");

Но это дает мне это исключение:

org.apache.camel.ExpectedBodyTypeException: Could not extract IN message body as type: interface javax.xml.transform.Source body is: null

Я застрял здесь. Может кто знает где может быть проблема?


person Paulius Matulionis    schedule 27.07.2012    source источник


Ответы (1)


Режим PAYLOAD не совсем простой, возможно, вам стоит попробовать режим POJO для CXF и избавиться от SoapMessage. Вам нужно будет объявить POJO с аннотациями JAXB, например

@XmlAccessorType(XmlAccessType.FIELD)
public class Registration {

    private Long roomNumber;
    ...

}

Это позволит вам работать непосредственно с классом Registration в ваших процессорах (что, как я полагаю, является вашей конечной целью).

Registration registration = exchange.getIn().getBody(Registration.class);

Если вы продолжаете использовать режим PAYLOAD, обратите внимание, что вы можете написать

SOAPMessage soapMessage = exchange.getIn().getHeader(CxfConstants.CAMEL_CXF_MESSAGE, SOAPMessage.class);
person cexbrayat    schedule 27.07.2012
comment
Еще кое-что. Регистрация — это всего лишь одна операция. Как я должен узнать, какую операцию я получаю в методе mu processMessage? Я могу как-нибудь проверить это на верблюде? - person Paulius Matulionis; 27.07.2012