我有个问题:
如何处理第三方以http:outbound-gateway(以及其中的jackson-com.fasterxml.jackson一种)未知的格式返回json响应的情况。
Spring集成配置:
<int:chain input-channel="ul_campaignSetup_channel">
<int:header-enricher>
<int:header name="Content-Type" value="application/json; charset=UTF-8"/>
</int:header-enricher>
<int-http:outbound-gateway id="ulHttpOutboundGateway"
http-method="POST"
url="${request.url}"
extract-request-payload="true"
error-handler="campaignSetupResponseHandler"
expected-response-type="integration.ul.message.CampaignSetupResponse"
request-factory="ulRequestFactory">
<int-http:uri-variable name="url" expression="headers.url"/>
</int-http:outbound-gateway>
<int:service-activator method="handle" ref="campaignSetupResponseHandler" />
<int:json-to-object-transformer id="myId" />
</int:chain>
<bean id="campaignSetupResponseHandler" class="integration.ul.message.CampaignSetupResponseHandler" />
<bean id="jackson2http" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper" ref="ulObjectMapper" />
</bean>
<bean id="ulObjectMapper" class="com.fasterxml.jackson.databind.ObjectMapper"/>
<bean id="ulRequestFactory" class="org.springframework.http.client.SimpleClientHttpRequestFactory">
<property name="connectTimeout" value="10000" />
<property name="readTimeout" value="10000" />
</bean>
public class CampaignSetupResponse {
private String status;
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
}
纠正来自第三方的JSON响应(有效):
{
"status" : "1"
}
来自第三方的不正确的JSON响应(导致异常):
{
"nonExistingProperty": "non existing value"
}
我得到的异常:
org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Unrecognized field "nonExistingProperty" (class integration.ul.message.CampaignSetupResponse), not marked as ignorable (one known property: "status"])
at [Source: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@20fddd96; line: 2, column: 27] (through reference chain: integration.ul.message.CampaignSetupResponse["nonExistingProperty"]); nested exception is com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "nonExistingProperty" (class integration.ul.message.CampaignSetupResponse), not marked as ignorable (one known property: "status"])
at [Source: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@20fddd96; line: 2, column: 27] (through reference chain: integration.ul.message.CampaignSetupResponse["nonExistingProperty"])
at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.readJavaType(MappingJackson2HttpMessageConverter.java:228)
at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.read(MappingJackson2HttpMessageConverter.java:220)
如何处理此解析异常?
我尝试了几种带有错误通道(http:outbound-gateway似乎没有一个)和错误处理程序(对于诸如500的实际http错误的处理程序)的解决方案,但无法处理Jackson解析异常。
大家欢迎任何想法,欢呼!
最佳答案
已经达成共识的接口是什么?
老实说,第二个响应与接口定义不符-我只是让他们修复它。 (对我来说,这看起来像是某种东西,例如不存在“ status”变量或其他东西)。
否则,您需要自己处理响应。