我刚接触弹簧集成,所以我可能会滥用条款。 我有一个ws:inbound-gateway监听soap web服务请求。
<int-ws:inbound-gateway id="myInGW"
request-channel="headersMapPopulationChannel"
reply-channel="ws-response-channel"
marshaller="marshaller"
unmarshaller="marshaller"/>
它将传入的请求发送到headersMapPopulationChannel,并将消息发送到适配器(用于从JAXB类转换为域),拆分器将其拆分为验证,日志记录和持久性。在持久性之后,我正在运行与业务相关的事情。我希望在所有这些上都有异常控制点,这样我就可以管理在异常的情况下要做什么。我故意在业务类中放置一个throw异常语句。抛出异常,但我的频道似乎没有得到它。 配置:
<int-ws:inbound-gateway id="myInGW"
request-channel="headersMapPopulationChannel"
reply-channel="ws-response-channel"
error-channel="ws-error-channel"
marshaller="marshaller"
unmarshaller="marshaller"/>
<int:channel id="ws-error-channel"/>
<int:service-activator input-channel="ws-error-channel"
expression="@exceptionHandlerService.handleThrowable(payload)"/>
<bean id="exceptionHandlerService" class="pack.integration.service.ExceptionHandlerService"/>
另外,我不知道在我最外面的频道中控制异常是否正确。无论我转发消息,我都应该听取异常吗?
答案 0 :(得分:1)
这是处理异常的正确方法。
该异常将包含在MessagingException
中,并作为error-channel
的有效内容发送到ErrorMessage
。 MessagingException
有两个属性cause
(原始异常)和failedMessage
(导致异常的消息)。
如果要将SOAP错误返回给客户端,则错误通道流必须抛出异常。
如果你没有在频道上看到ErrorMessage
,那么其他东西必须抓住异常。
我建议您启用调试日志记录并通过系统跟踪消息。
答案 1 :(得分:0)
我还使用段网关将所有异常重定向到另一个消息流,并从那里决定如何处理它们。