拦截并将传入消息记录到端点

时间:2019-11-05 10:17:14

标签: java apache-camel cxf javabeans

我想在我的bean设置中记录传入的SOAP,但是我不知道如何截获所请求的主体。

我发现是否在CxfEndpoint中添加了?dataFormat = MESSAGE ,它显示了xml输入,但弄乱了提供 addBookTransformer 的dataFormat。

<from uri="cxf:bean:CxfEndpoint?dataFormat=MESSAGE" /> 

这是我的设置

<cxf:cxfEndpoint id="CxfEndpoint"
    address="/host/addBook"
    endpointName="a:addBookEndpoint"
    serviceName="a:addBookService"
    wsdlURL="wsdl/add-book.wsdl"
    serviceClass="com.library.AddBookEndpoint"
    xmlns:a="http://library.com"/>

<bean id="addBookTransformer" class="com.library.bookshelf.AddBookTransformer"/>

<camelContext xmlns="http://camel.apache.org/schema/spring">
    <route id="addBook" streamCache="true">
        <from uri="cxf:bean:CxfEndpoint" />
        <process ref="addBookTransformer" />
        <log message="${body}"/>
    </route>
</camelContext>

是否有一种方法可以迭代并记录传入的帖子请求数据?

2 个答案:

答案 0 :(得分:2)

您可以为此进行窃听

<camelContext xmlns="http://camel.apache.org/schema/spring">
    <route id="addBook" streamCache="true">
        <from uri="cxf:bean:CxfEndpoint" />
        <process ref="addBookTransformer" />
        <wireTap uri="direct:tap"/>
        <to uri="mock:result"/>
        <log message="${body}"/>
    </route>
</camelContext>

将交易所的副本发送到direct:tap,您可以根据需要读取和处理该副本。

例如,我们可以这样记录消息。您还可以添加其他处理器。

<route id="wiretapped" streamCache="true">
     <from uri="direct:tap" />
     <log message="${body}"/>
</route>

这里是documentation

答案 1 :(得分:0)

您要寻找的是一个非常众所周知的要求。提供解决方案的模式是Filter,并且在J2EE规范的早期版本中就作为一个概念存在。回到我们(恐龙)编写servlet的时代,您可以在servlet中添加一个过滤器,该过滤器既拦截请求,在到达servlet之前请求,又在servlet生成之后但在发送给客户端之前进行响应。 。在过滤器中,您可以记录信息,将其重定向到其他目标,拒绝它或执行您喜欢的任何事情。相同的概念保持不变。您需要为所有或某些端点定义一个过滤器,并在过滤器中进行日志记录。如果您使用Spring Boot,那么这里的文章描述了如何在Spring Boot中为端点添加过滤器:How to Define a Spring Boot Filter?