我有一个骡子流,其中我有一个变量,有效载荷复制如下:
<set-variable variableName="originalPayload" value="#[payload]" doc:name="Variable" doc:description="Variable having copy of original payload present in soap request."/>
在此之后有一个拦截器验证soap消息的头部,如果验证失败,那么我需要拦截器中的上述变量数据来准备自定义故障消息。以下是我在上面进行Soap Proxy的配置:
<cxf:proxy-service port="XXX" namespace="XXX" service="XXX" payload="body" wsdlLocation="XXXX" doc:name="SOAP" doc:description="Soap proxy intercept soap request and apply header validation. Authentication and custom header will be validated for presence, content, and structure.">
<cxf:inInterceptors>
<spring:bean id="XXXX" parent="XXXX">
<spring:property name="sourceApplication" value="${sourceApplication}"/>
<spring:property name="originalMessage" value="#[originalPayload]"/>
</spring:bean>
</cxf:inInterceptors>
</cxf:proxy-service>
在上面我需要spring bean的originalMessage属性中的originalPayload变量的值。如果我可以直接复制#[payload],它也会起作用。 spring属性中的上面表达式无效,因此无效。
请建议如何去做。
实现Callable可以是一个选项,但我不想更改已经编写的代码,除非上面没有解决方案。
我试图在此搜索解决方案但找不到任何东西。
由于 哈里什库马尔
答案 0 :(得分:1)
您的解决方案的问题是spring属性是在配置时设置的,而#[payload]
表达式只能在运行时解析。
但是在拦截器中,您可以通过执行以下操作从CXF消息中检索原始有效负载:
MuleEvent event = (MuleEvent) message.getExchange().get(CxfConstants.MULE_EVENT);
Collection<Attachment> a = event.getMessage().getInvocationProperty("originalPayload");
您可以参考this interceptor作为示例