Java 从服务异常检索Spring集成中的消息
我正在使用Spring集成开发一个Restful API,当我的一个服务出现异常时,我无法检索消息Java 从服务异常检索Spring集成中的消息,java,spring,http,rest,spring-integration,Java,Spring,Http,Rest,Spring Integration,我正在使用Spring集成开发一个Restful API,当我的一个服务出现异常时,我无法检索消息 <int-http:inbound-gateway id="v1.getEvent.inbound.gateway" path="/ptgapi/{apiVersion}/clients/{clientId}/events/{eventId}" supported-method
<int-http:inbound-gateway id="v1.getEvent.inbound.gateway"
path="/ptgapi/{apiVersion}/clients/{clientId}/events/{eventId}"
supported-methods="GET"
request-channel="v1.getEvent.channel.input"
reply-channel="v1.getEvent.channel.output"
error-channel="v1.getEvent.channel.error"
convert-exceptions="true"
mapped-request-headers="HTTP_REQUEST_HEADERS,X-ptg-client-token,X-ptg-user-id,X-ptg-user-token,X-ptg-channel"
request-timeout="50000"
reply-timeout="50000">
<int-http:header name="apiVersion" expression="#pathVariables.apiVersion"/>
<int-http:header name="clientId" expression="#pathVariables.clientId"/>
<int-http:header name="eventId" expression="#pathVariables.eventId"/>
</int-http:inbound-gateway>
<int:chain input-channel="v1.getEvent.channel.input" output-channel="v1.getEvent.channel.output" send-timeout="50000">
<int:header-enricher>
<int:error-channel ref="v1.getEvent.channel.error" />
</int:header-enricher>
<int:service-activator ref="v1.validation.service" method="validateRequest"/>
<int:service-activator ref="v1.getEvent.service" method="getEvent"/>
<int:object-to-json-transformer/>
</int:chain>
<int:chain input-channel="v1.getEvent.channel.error" output-channel="v1.getEvent.channel.output">
<int:transformer ref="errorUnwrapper" method="manageError" />
</int:chain>
这是我的应用程序上下文:
<int-http:inbound-gateway id="v1.getEvent.inbound.gateway"
path="/ptgapi/{apiVersion}/clients/{clientId}/events/{eventId}"
supported-methods="GET"
request-channel="v1.getEvent.channel.input"
reply-channel="v1.getEvent.channel.output"
error-channel="v1.getEvent.channel.error"
convert-exceptions="true"
mapped-request-headers="HTTP_REQUEST_HEADERS,X-ptg-client-token,X-ptg-user-id,X-ptg-user-token,X-ptg-channel"
request-timeout="50000"
reply-timeout="50000">
<int-http:header name="apiVersion" expression="#pathVariables.apiVersion"/>
<int-http:header name="clientId" expression="#pathVariables.clientId"/>
<int-http:header name="eventId" expression="#pathVariables.eventId"/>
</int-http:inbound-gateway>
<int:chain input-channel="v1.getEvent.channel.input" output-channel="v1.getEvent.channel.output" send-timeout="50000">
<int:header-enricher>
<int:error-channel ref="v1.getEvent.channel.error" />
</int:header-enricher>
<int:service-activator ref="v1.validation.service" method="validateRequest"/>
<int:service-activator ref="v1.getEvent.service" method="getEvent"/>
<int:object-to-json-transformer/>
</int:chain>
<int:chain input-channel="v1.getEvent.channel.error" output-channel="v1.getEvent.channel.output">
<int:transformer ref="errorUnwrapper" method="manageError" />
</int:chain>
我的errorUnwrapper transformer是:
<int-http:inbound-gateway id="v1.getEvent.inbound.gateway"
path="/ptgapi/{apiVersion}/clients/{clientId}/events/{eventId}"
supported-methods="GET"
request-channel="v1.getEvent.channel.input"
reply-channel="v1.getEvent.channel.output"
error-channel="v1.getEvent.channel.error"
convert-exceptions="true"
mapped-request-headers="HTTP_REQUEST_HEADERS,X-ptg-client-token,X-ptg-user-id,X-ptg-user-token,X-ptg-channel"
request-timeout="50000"
reply-timeout="50000">
<int-http:header name="apiVersion" expression="#pathVariables.apiVersion"/>
<int-http:header name="clientId" expression="#pathVariables.clientId"/>
<int-http:header name="eventId" expression="#pathVariables.eventId"/>
</int-http:inbound-gateway>
<int:chain input-channel="v1.getEvent.channel.input" output-channel="v1.getEvent.channel.output" send-timeout="50000">
<int:header-enricher>
<int:error-channel ref="v1.getEvent.channel.error" />
</int:header-enricher>
<int:service-activator ref="v1.validation.service" method="validateRequest"/>
<int:service-activator ref="v1.getEvent.service" method="getEvent"/>
<int:object-to-json-transformer/>
</int:chain>
<int:chain input-channel="v1.getEvent.channel.error" output-channel="v1.getEvent.channel.output">
<int:transformer ref="errorUnwrapper" method="manageError" />
</int:chain>
@消息端点
公共类错误展开器{
<int-http:inbound-gateway id="v1.getEvent.inbound.gateway"
path="/ptgapi/{apiVersion}/clients/{clientId}/events/{eventId}"
supported-methods="GET"
request-channel="v1.getEvent.channel.input"
reply-channel="v1.getEvent.channel.output"
error-channel="v1.getEvent.channel.error"
convert-exceptions="true"
mapped-request-headers="HTTP_REQUEST_HEADERS,X-ptg-client-token,X-ptg-user-id,X-ptg-user-token,X-ptg-channel"
request-timeout="50000"
reply-timeout="50000">
<int-http:header name="apiVersion" expression="#pathVariables.apiVersion"/>
<int-http:header name="clientId" expression="#pathVariables.clientId"/>
<int-http:header name="eventId" expression="#pathVariables.eventId"/>
</int-http:inbound-gateway>
<int:chain input-channel="v1.getEvent.channel.input" output-channel="v1.getEvent.channel.output" send-timeout="50000">
<int:header-enricher>
<int:error-channel ref="v1.getEvent.channel.error" />
</int:header-enricher>
<int:service-activator ref="v1.validation.service" method="validateRequest"/>
<int:service-activator ref="v1.getEvent.service" method="getEvent"/>
<int:object-to-json-transformer/>
</int:chain>
<int:chain input-channel="v1.getEvent.channel.error" output-channel="v1.getEvent.channel.output">
<int:transformer ref="errorUnwrapper" method="manageError" />
</int:chain>
@Transformer
public Message<?> manageError(Message<?> errorMessage) {
Message<?> failedMessage = ((MessagingException) errorMessage.getPayload())
.getFailedMessage();
Message<?> messageOut = MessageBuilder
.withPayload("")
.copyHeadersIfAbsent(failedMessage.getHeaders())
.setHeaderIfAbsent(HttpHeaders.STATUS_CODE, HttpStatus.ALREADY_REPORTED)
.build();
return failedMessage;
}
变压器
公共消息管理器错误(消息错误消息){
Message failedMessage=((MessaginException)errorMessage.getPayload())
.getFailedMessage();
messageOut=MessageBuilder
.有效载荷(“”)
.CopyHeadersFabSent(failedMessage.getHeaders())
.setHeaderIfAbsent(HttpHeaders.STATUS_代码,HttpStatus.Haven_报告)
.build();
返回失败消息;
}
}
<int-http:inbound-gateway id="v1.getEvent.inbound.gateway"
path="/ptgapi/{apiVersion}/clients/{clientId}/events/{eventId}"
supported-methods="GET"
request-channel="v1.getEvent.channel.input"
reply-channel="v1.getEvent.channel.output"
error-channel="v1.getEvent.channel.error"
convert-exceptions="true"
mapped-request-headers="HTTP_REQUEST_HEADERS,X-ptg-client-token,X-ptg-user-id,X-ptg-user-token,X-ptg-channel"
request-timeout="50000"
reply-timeout="50000">
<int-http:header name="apiVersion" expression="#pathVariables.apiVersion"/>
<int-http:header name="clientId" expression="#pathVariables.clientId"/>
<int-http:header name="eventId" expression="#pathVariables.eventId"/>
</int-http:inbound-gateway>
<int:chain input-channel="v1.getEvent.channel.input" output-channel="v1.getEvent.channel.output" send-timeout="50000">
<int:header-enricher>
<int:error-channel ref="v1.getEvent.channel.error" />
</int:header-enricher>
<int:service-activator ref="v1.validation.service" method="validateRequest"/>
<int:service-activator ref="v1.getEvent.service" method="getEvent"/>
<int:object-to-json-transformer/>
</int:chain>
<int:chain input-channel="v1.getEvent.channel.error" output-channel="v1.getEvent.channel.output">
<int:transformer ref="errorUnwrapper" method="manageError" />
</int:chain>
其思想是在transformer中分配状态错误代码以通知用户,但信息永远不会到达客户端,尽管我可以确认返回语句在调试模式下到达
<int-http:inbound-gateway id="v1.getEvent.inbound.gateway"
path="/ptgapi/{apiVersion}/clients/{clientId}/events/{eventId}"
supported-methods="GET"
request-channel="v1.getEvent.channel.input"
reply-channel="v1.getEvent.channel.output"
error-channel="v1.getEvent.channel.error"
convert-exceptions="true"
mapped-request-headers="HTTP_REQUEST_HEADERS,X-ptg-client-token,X-ptg-user-id,X-ptg-user-token,X-ptg-channel"
request-timeout="50000"
reply-timeout="50000">
<int-http:header name="apiVersion" expression="#pathVariables.apiVersion"/>
<int-http:header name="clientId" expression="#pathVariables.clientId"/>
<int-http:header name="eventId" expression="#pathVariables.eventId"/>
</int-http:inbound-gateway>
<int:chain input-channel="v1.getEvent.channel.input" output-channel="v1.getEvent.channel.output" send-timeout="50000">
<int:header-enricher>
<int:error-channel ref="v1.getEvent.channel.error" />
</int:header-enricher>
<int:service-activator ref="v1.validation.service" method="validateRequest"/>
<int:service-activator ref="v1.getEvent.service" method="getEvent"/>
<int:object-to-json-transformer/>
</int:chain>
<int:chain input-channel="v1.getEvent.channel.error" output-channel="v1.getEvent.channel.output">
<int:transformer ref="errorUnwrapper" method="manageError" />
</int:chain>
这里可能有什么问题
<int-http:inbound-gateway id="v1.getEvent.inbound.gateway"
path="/ptgapi/{apiVersion}/clients/{clientId}/events/{eventId}"
supported-methods="GET"
request-channel="v1.getEvent.channel.input"
reply-channel="v1.getEvent.channel.output"
error-channel="v1.getEvent.channel.error"
convert-exceptions="true"
mapped-request-headers="HTTP_REQUEST_HEADERS,X-ptg-client-token,X-ptg-user-id,X-ptg-user-token,X-ptg-channel"
request-timeout="50000"
reply-timeout="50000">
<int-http:header name="apiVersion" expression="#pathVariables.apiVersion"/>
<int-http:header name="clientId" expression="#pathVariables.clientId"/>
<int-http:header name="eventId" expression="#pathVariables.eventId"/>
</int-http:inbound-gateway>
<int:chain input-channel="v1.getEvent.channel.input" output-channel="v1.getEvent.channel.output" send-timeout="50000">
<int:header-enricher>
<int:error-channel ref="v1.getEvent.channel.error" />
</int:header-enricher>
<int:service-activator ref="v1.validation.service" method="validateRequest"/>
<int:service-activator ref="v1.getEvent.service" method="getEvent"/>
<int:object-to-json-transformer/>
</int:chain>
<int:chain input-channel="v1.getEvent.channel.error" output-channel="v1.getEvent.channel.output">
<int:transformer ref="errorUnwrapper" method="manageError" />
</int:chain>
谢谢 问题是您正在从
failedMessage
回复失效的replyChannel标头;网关正在等待errorMessage中replyChannel标头上的答复
<int-http:inbound-gateway id="v1.getEvent.inbound.gateway"
path="/ptgapi/{apiVersion}/clients/{clientId}/events/{eventId}"
supported-methods="GET"
request-channel="v1.getEvent.channel.input"
reply-channel="v1.getEvent.channel.output"
error-channel="v1.getEvent.channel.error"
convert-exceptions="true"
mapped-request-headers="HTTP_REQUEST_HEADERS,X-ptg-client-token,X-ptg-user-id,X-ptg-user-token,X-ptg-channel"
request-timeout="50000"
reply-timeout="50000">
<int-http:header name="apiVersion" expression="#pathVariables.apiVersion"/>
<int-http:header name="clientId" expression="#pathVariables.clientId"/>
<int-http:header name="eventId" expression="#pathVariables.eventId"/>
</int-http:inbound-gateway>
<int:chain input-channel="v1.getEvent.channel.input" output-channel="v1.getEvent.channel.output" send-timeout="50000">
<int:header-enricher>
<int:error-channel ref="v1.getEvent.channel.error" />
</int:header-enricher>
<int:service-activator ref="v1.validation.service" method="validateRequest"/>
<int:service-activator ref="v1.getEvent.service" method="getEvent"/>
<int:object-to-json-transformer/>
</int:chain>
<int:chain input-channel="v1.getEvent.channel.error" output-channel="v1.getEvent.channel.output">
<int:transformer ref="errorUnwrapper" method="manageError" />
</int:chain>
您可以简单地使用errorMessage,或者,如果需要failedMessage中的其他头,可以使用copyHeaders(errorMessage.getHeaders()).CopyHeadersFabSent(failedMessage.getHeaders())
<int-http:inbound-gateway id="v1.getEvent.inbound.gateway"
path="/ptgapi/{apiVersion}/clients/{clientId}/events/{eventId}"
supported-methods="GET"
request-channel="v1.getEvent.channel.input"
reply-channel="v1.getEvent.channel.output"
error-channel="v1.getEvent.channel.error"
convert-exceptions="true"
mapped-request-headers="HTTP_REQUEST_HEADERS,X-ptg-client-token,X-ptg-user-id,X-ptg-user-token,X-ptg-channel"
request-timeout="50000"
reply-timeout="50000">
<int-http:header name="apiVersion" expression="#pathVariables.apiVersion"/>
<int-http:header name="clientId" expression="#pathVariables.clientId"/>
<int-http:header name="eventId" expression="#pathVariables.eventId"/>
</int-http:inbound-gateway>
<int:chain input-channel="v1.getEvent.channel.input" output-channel="v1.getEvent.channel.output" send-timeout="50000">
<int:header-enricher>
<int:error-channel ref="v1.getEvent.channel.error" />
</int:header-enricher>
<int:service-activator ref="v1.validation.service" method="validateRequest"/>
<int:service-activator ref="v1.getEvent.service" method="getEvent"/>
<int:object-to-json-transformer/>
</int:chain>
<int:chain input-channel="v1.getEvent.channel.error" output-channel="v1.getEvent.channel.output">
<int:transformer ref="errorUnwrapper" method="manageError" />
</int:chain>
这将保留正确的replyChannel
<int-http:inbound-gateway id="v1.getEvent.inbound.gateway"
path="/ptgapi/{apiVersion}/clients/{clientId}/events/{eventId}"
supported-methods="GET"
request-channel="v1.getEvent.channel.input"
reply-channel="v1.getEvent.channel.output"
error-channel="v1.getEvent.channel.error"
convert-exceptions="true"
mapped-request-headers="HTTP_REQUEST_HEADERS,X-ptg-client-token,X-ptg-user-id,X-ptg-user-token,X-ptg-channel"
request-timeout="50000"
reply-timeout="50000">
<int-http:header name="apiVersion" expression="#pathVariables.apiVersion"/>
<int-http:header name="clientId" expression="#pathVariables.clientId"/>
<int-http:header name="eventId" expression="#pathVariables.eventId"/>
</int-http:inbound-gateway>
<int:chain input-channel="v1.getEvent.channel.input" output-channel="v1.getEvent.channel.output" send-timeout="50000">
<int:header-enricher>
<int:error-channel ref="v1.getEvent.channel.error" />
</int:header-enricher>
<int:service-activator ref="v1.validation.service" method="validateRequest"/>
<int:service-activator ref="v1.getEvent.service" method="getEvent"/>
<int:object-to-json-transformer/>
</int:chain>
<int:chain input-channel="v1.getEvent.channel.error" output-channel="v1.getEvent.channel.output">
<int:transformer ref="errorUnwrapper" method="manageError" />
</int:chain>
在3.0中(目前处于里程碑2),我们添加了增强的诊断功能,以报告这一相当常见的错误(回复被发送到失效的回复频道)。问题是您正在从
failedMessage
回复失效的回复频道标题;网关正在等待errorMessage中replyChannel标头上的答复
<int-http:inbound-gateway id="v1.getEvent.inbound.gateway"
path="/ptgapi/{apiVersion}/clients/{clientId}/events/{eventId}"
supported-methods="GET"
request-channel="v1.getEvent.channel.input"
reply-channel="v1.getEvent.channel.output"
error-channel="v1.getEvent.channel.error"
convert-exceptions="true"
mapped-request-headers="HTTP_REQUEST_HEADERS,X-ptg-client-token,X-ptg-user-id,X-ptg-user-token,X-ptg-channel"
request-timeout="50000"
reply-timeout="50000">
<int-http:header name="apiVersion" expression="#pathVariables.apiVersion"/>
<int-http:header name="clientId" expression="#pathVariables.clientId"/>
<int-http:header name="eventId" expression="#pathVariables.eventId"/>
</int-http:inbound-gateway>
<int:chain input-channel="v1.getEvent.channel.input" output-channel="v1.getEvent.channel.output" send-timeout="50000">
<int:header-enricher>
<int:error-channel ref="v1.getEvent.channel.error" />
</int:header-enricher>
<int:service-activator ref="v1.validation.service" method="validateRequest"/>
<int:service-activator ref="v1.getEvent.service" method="getEvent"/>
<int:object-to-json-transformer/>
</int:chain>
<int:chain input-channel="v1.getEvent.channel.error" output-channel="v1.getEvent.channel.output">
<int:transformer ref="errorUnwrapper" method="manageError" />
</int:chain>
您可以简单地使用errorMessage,或者,如果需要failedMessage中的其他头,可以使用copyHeaders(errorMessage.getHeaders()).CopyHeadersFabSent(failedMessage.getHeaders())
<int-http:inbound-gateway id="v1.getEvent.inbound.gateway"
path="/ptgapi/{apiVersion}/clients/{clientId}/events/{eventId}"
supported-methods="GET"
request-channel="v1.getEvent.channel.input"
reply-channel="v1.getEvent.channel.output"
error-channel="v1.getEvent.channel.error"
convert-exceptions="true"
mapped-request-headers="HTTP_REQUEST_HEADERS,X-ptg-client-token,X-ptg-user-id,X-ptg-user-token,X-ptg-channel"
request-timeout="50000"
reply-timeout="50000">
<int-http:header name="apiVersion" expression="#pathVariables.apiVersion"/>
<int-http:header name="clientId" expression="#pathVariables.clientId"/>
<int-http:header name="eventId" expression="#pathVariables.eventId"/>
</int-http:inbound-gateway>
<int:chain input-channel="v1.getEvent.channel.input" output-channel="v1.getEvent.channel.output" send-timeout="50000">
<int:header-enricher>
<int:error-channel ref="v1.getEvent.channel.error" />
</int:header-enricher>
<int:service-activator ref="v1.validation.service" method="validateRequest"/>
<int:service-activator ref="v1.getEvent.service" method="getEvent"/>
<int:object-to-json-transformer/>
</int:chain>
<int:chain input-channel="v1.getEvent.channel.error" output-channel="v1.getEvent.channel.output">
<int:transformer ref="errorUnwrapper" method="manageError" />
</int:chain>
这将保留正确的replyChannel
<int-http:inbound-gateway id="v1.getEvent.inbound.gateway"
path="/ptgapi/{apiVersion}/clients/{clientId}/events/{eventId}"
supported-methods="GET"
request-channel="v1.getEvent.channel.input"
reply-channel="v1.getEvent.channel.output"
error-channel="v1.getEvent.channel.error"
convert-exceptions="true"
mapped-request-headers="HTTP_REQUEST_HEADERS,X-ptg-client-token,X-ptg-user-id,X-ptg-user-token,X-ptg-channel"
request-timeout="50000"
reply-timeout="50000">
<int-http:header name="apiVersion" expression="#pathVariables.apiVersion"/>
<int-http:header name="clientId" expression="#pathVariables.clientId"/>
<int-http:header name="eventId" expression="#pathVariables.eventId"/>
</int-http:inbound-gateway>
<int:chain input-channel="v1.getEvent.channel.input" output-channel="v1.getEvent.channel.output" send-timeout="50000">
<int:header-enricher>
<int:error-channel ref="v1.getEvent.channel.error" />
</int:header-enricher>
<int:service-activator ref="v1.validation.service" method="validateRequest"/>
<int:service-activator ref="v1.getEvent.service" method="getEvent"/>
<int:object-to-json-transformer/>
</int:chain>
<int:chain input-channel="v1.getEvent.channel.error" output-channel="v1.getEvent.channel.output">
<int:transformer ref="errorUnwrapper" method="manageError" />
</int:chain>
在3.0中(目前处于里程碑2),我们添加了增强诊断来报告这一相当常见的错误(回复被发送到失效的回复通道)
<int-http:inbound-gateway id="v1.getEvent.inbound.gateway"
path="/ptgapi/{apiVersion}/clients/{clientId}/events/{eventId}"
supported-methods="GET"
request-channel="v1.getEvent.channel.input"
reply-channel="v1.getEvent.channel.output"
error-channel="v1.getEvent.channel.error"
convert-exceptions="true"
mapped-request-headers="HTTP_REQUEST_HEADERS,X-ptg-client-token,X-ptg-user-id,X-ptg-user-token,X-ptg-channel"
request-timeout="50000"
reply-timeout="50000">
<int-http:header name="apiVersion" expression="#pathVariables.apiVersion"/>
<int-http:header name="clientId" expression="#pathVariables.clientId"/>
<int-http:header name="eventId" expression="#pathVariables.eventId"/>
</int-http:inbound-gateway>
<int:chain input-channel="v1.getEvent.channel.input" output-channel="v1.getEvent.channel.output" send-timeout="50000">
<int:header-enricher>
<int:error-channel ref="v1.getEvent.channel.error" />
</int:header-enricher>
<int:service-activator ref="v1.validation.service" method="validateRequest"/>
<int:service-activator ref="v1.getEvent.service" method="getEvent"/>
<int:object-to-json-transformer/>
</int:chain>
<int:chain input-channel="v1.getEvent.channel.error" output-channel="v1.getEvent.channel.output">
<int:transformer ref="errorUnwrapper" method="manageError" />
</int:chain>