Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从服务异常检索Spring集成中的消息_Java_Spring_Http_Rest_Spring Integration - Fatal编程技术网

Java 从服务异常检索Spring集成中的消息

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

我正在使用Spring集成开发一个Restful API,当我的一个服务出现异常时,我无法检索消息

<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>