入站网关中的HttpMessageConverter错误处理

时间:2016-07-19 10:08:04

标签: java xml spring jaxb spring-integration

在我的入站网关中使用邮件转换器发生转换错误时,我遇到了一种奇怪的行为。下面的示例中的想法是接收XML有效负载(或序列化的Java),将它们转换为java对象并使用相同的媒体类型进行响应。

鉴于此配置:

<bean id="converterXml" class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter" />
<bean id="converterSerialized" class="org.springframework.integration.http.converter.SerializingHttpMessageConverter" />

<util:list id="converters">
  <ref bean="converterXml" />
  <ref bean="converterSerialized" />
</util:list>

<int-http:inbound-gateway id="inboundIntegrationGateway" 
  view-name="/integration"
  message-converters="converters" error-channel="errorChannel"
  request-payload-type="MyXmlPojo"
  supported-methods="POST" request-channel="inboundIntegration"
  path="/services/integration"
  reply-timeout="50000">
</int-http:inbound-gateway>

如果提交了无效的XML有效负载(例如,没有结束标记),则JAXB XML转换器中引发的异常HttpMessageNotReadableException不会在errorChannel中转发(我在其中定义了一个服务激活器来处理异常)。请注意,此处理程序在有效负载转换后效果良好。

<int:service-activator input-channel="errorChannel" ref="exceptionHandlerService"
method="handleException" requires-reply="true" />

我在这里缺少什么?为什么我的错误处理程序没有处理HttpMessageNotReadableException?欢迎任何帮助!

2 个答案:

答案 0 :(得分:2)

  

为什么我的错误处理程序不处理HttpMessageNotReadableException?

Message仅在我们已将Message发送到下游流程时生效,但如果您的传入HTTP请求无法转换为error-channel,则仍然有效没有要发送给convertExceptions = true

是的,使用HttpMessageConverter,我们不能按原样返回异常,并让一些SerializingHttpMessageConverter将其转换为合理的HTTP响应。通常情况cherrypy.config.update({'server.socket_host': '127.0.0.1', 'server.socket_port': 9023 }) 在场。

  

为什么这个异常没有包含在MessageHandlingException中并发送到我的错误处理程序?

仅仅是因为我们尚未接通消息。有了您的问题,我们仍然处于标准的Spring MVC环境中,在请求转换期间,Spring Integration仍然无能为力。

您应该考虑Spring MVC的一些解决方案:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-exceptionhandlers

答案 1 :(得分:0)

convert-exceptions="true"添加到int-http:inbound-gateway可以解决异常流问题。这post对我有用。