java - 从 org.apache.camel.Exchange 获取 SOAPMessage

标签 java soap cxf apache-camel apache-karaf

我需要从 spring bean 中收到的交换对象获取 SOAP 消息。

我有一个 Camel 路由,它从服务端点路由到我的java bean。 Spring中声明的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 消息。我 Camel 网站,here我发现我必须使用它来获取 SOAP 消息:

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

但是他给了我NullPointerException某处深入的交换。

我尝试调试并查看对象树。我发现我可以收到这样的消息:

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

但这给了我这个异常(exception):

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

我被困在这里了。也许有人知道问题出在哪里?

最佳答案

PAYLOAD 模式不是很简单的方法,也许您应该尝试 CXF 的 POJO 模式,并摆脱 SoapMessage。您必须使用 JAXB 注释声明 POJO,例如

@XmlAccessorType(XmlAccessType.FIELD)
public class Registration {

    private Long roomNumber;
    ...

}

这将允许您直接处理处理器中的注册类(我认为这是您的最终目标)。

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

如果您坚持使用 PAYLOAD 模式,请注意您可以编写

SOAPMessage soapMessage = exchange.getIn().getHeader(CxfConstants.CAMEL_CXF_MESSAGE, SOAPMessage.class);

关于java - 从 org.apache.camel.Exchange 获取 SOAPMessage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11686135/

相关文章:

wcf - 使用 WCF 发送签名请求并接收未签名响应

java - 升级 CXF 和 WSS4J 但找不到依赖项

java - 如何确定在注册时结束句子的时间?

java - 将 java 泛型用于简单工厂 - 如何避免这些警告

java - 在vlcj中,AudioTrackInfo得到的 "level"是什么?

java - 解析 SOAP 消息的工具包

java - 使用 JBoss 或 Tomcat 的独立应用程序

web-services - 计算 SOAP 内容长度

java - 在同一场 war 中从另一个 Web 服务调用 Web 服务 - apache cxf

java - 如何在 CXF 的 READ 阶段从 SoapMessage 中提取请求的操作名称?