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

Intercept and log incoming message to endpoint

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

我发现如果我将 ?dataFormat=MESSAGE 添加到我的 CxfEndpoint 它会显示 xml 输入但会弄乱提供 的数据格式addBookTransformer.

<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>

有没有办法拦截并记录传入的 post 请求数据?

你可以窃听这个

<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

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