如何处理 spring 集成中的错误
How to handle errors in spring integration
我已经关注了 link
但是我还不是很了解
我查看了 3. 实现 https://www.baeldung.com/spring-rest-template-error-handling 的 ResponseErrorHandler,但不确定在 // handle SERVER_ERROR 等处做什么
我的流量:
其余端点调用网关方法,然后在下面。
<int:gateway id="tService"
service-interface="h.lr.eai.TGateway"
default-reply-channel="dest-channel"
default-request-timeout="5000" default-reply-timeout="5000">
<int:method name="vrCorrect" request-channel="tInChannel"/>
<int:method name="...." />
....
</int:gateway>
<int:chain input-channel="tInChannel" output-channel="headerFilterChannel">
<int:header-enricher>
<int:header name="Accept" value="application/json" />
<int:header name="Content-Type" value="application/json" />
</int:header-enricher>
<int-http:outbound-gateway
url="${TURL}/im/rest/something"
http-method="POST"
header-mapper="headerMapper"
error-handler="errorHandler"
expected-response-type="java.lang.String">
</int-http:outbound-gateway>
</int:chain>
<bean id="errorHandler" class="com.util.ErrorHandler" />
java class。以为没有太多实现,看起来没有这个,我没有收到外部服务抛出的错误消息。
有什么方法可以摆脱这个 class,因为它几乎是默认设置 [虽然根据 baeldung 文章添加了 CLIENT 和 SERVER 错误检查?
public class ErrorHandler extends DefaultResponseErrorHandler {
@Override
public boolean hasError(ClientHttpResponse response) throws IOException {
return (
response.getStatusCode().series() == HttpStatus.Series.CLIENT_ERROR
|| response.getStatusCode().series() == HttpStatus.Series.SERVER_ERROR);
}
@Override
public void handleError(ClientHttpResponse response) throws IOException { /* Handle Exceptions */
}
}
我看到了使用 Advices 的建议。我可以举个例子吗?
[不确定这是 spring 休息还是 spring 整合]
编辑 1:
我正在呼叫外部服务。它可以给出如下错误信息
{
"code": "F01",
"userMessage": "The is some data error....",
"parameters": {}
}
在我将错误处理程序添加到 http-outbound-gateway 之前,我总是收到 "Bad Request" 的响应 [并且缺少像上面那样的明确消息]
添加错误处理程序和 class 后,我可以转发外部服务在其响应主体中提供的任何错误消息。这是可以接受的,但我在 handleError 中没有任何实现 [就像你回答的那样]。在这种情况下,有没有办法摆脱这个 class 并利用任何 OOTB class?因为我没有理由解释为什么它在那里[可能是我不明白它的重要性]。
P.S。 @Artem Bilan,你的回答可能就足够了[如果我需要class来解决我的问题]
不清楚你的问题是什么,但我会尝试解释一些事情。
您绝对可能不需要那个自定义 ErrorHandler
,因为默认的非常好,最后它只是这样做:
protected void handleError(ClientHttpResponse response, HttpStatus statusCode) throws IOException {
String statusText = response.getStatusText();
HttpHeaders headers = response.getHeaders();
byte[] body = getResponseBody(response);
Charset charset = getCharset(response);
switch (statusCode.series()) {
case CLIENT_ERROR:
throw HttpClientErrorException.create(statusCode, statusText, headers, body, charset);
case SERVER_ERROR:
throw HttpServerErrorException.create(statusCode, statusText, headers, body, charset);
default:
throw new UnknownHttpStatusCodeException(statusCode.value(), statusText, headers, body, charset);
}
}
因此,它解析响应并向调用者抛出相应的异常。
如果您在调用该 REST 服务时需要以某种方式对这个或那个异常做出反应,您需要考虑对 <int-http:outbound-gateway>
使用 ExpressionEvaluatingRequestHandlerAdvice
。这样,从 DefaultResponseErrorHandler
传播的异常可以发送到某些 failureChannel
,以获得可能的逻辑如何对此异常做出反应。
在文档中查看更多信息:https://docs.spring.io/spring-integration/docs/current/reference/html/#message-handler-advice-chain
如果这不是您所期望的,请重新表述您的问题,因为我还不清楚...
谢谢理解。
我已经关注了 link
但是我还不是很了解
我查看了 3. 实现 https://www.baeldung.com/spring-rest-template-error-handling 的 ResponseErrorHandler,但不确定在 // handle SERVER_ERROR 等处做什么
我的流量:
其余端点调用网关方法,然后在下面。
<int:gateway id="tService"
service-interface="h.lr.eai.TGateway"
default-reply-channel="dest-channel"
default-request-timeout="5000" default-reply-timeout="5000">
<int:method name="vrCorrect" request-channel="tInChannel"/>
<int:method name="...." />
....
</int:gateway>
<int:chain input-channel="tInChannel" output-channel="headerFilterChannel">
<int:header-enricher>
<int:header name="Accept" value="application/json" />
<int:header name="Content-Type" value="application/json" />
</int:header-enricher>
<int-http:outbound-gateway
url="${TURL}/im/rest/something"
http-method="POST"
header-mapper="headerMapper"
error-handler="errorHandler"
expected-response-type="java.lang.String">
</int-http:outbound-gateway>
</int:chain>
<bean id="errorHandler" class="com.util.ErrorHandler" />
java class。以为没有太多实现,看起来没有这个,我没有收到外部服务抛出的错误消息。
有什么方法可以摆脱这个 class,因为它几乎是默认设置 [虽然根据 baeldung 文章添加了 CLIENT 和 SERVER 错误检查?
public class ErrorHandler extends DefaultResponseErrorHandler {
@Override
public boolean hasError(ClientHttpResponse response) throws IOException {
return (
response.getStatusCode().series() == HttpStatus.Series.CLIENT_ERROR
|| response.getStatusCode().series() == HttpStatus.Series.SERVER_ERROR);
}
@Override
public void handleError(ClientHttpResponse response) throws IOException { /* Handle Exceptions */
}
}
我看到了使用 Advices 的建议。我可以举个例子吗? [不确定这是 spring 休息还是 spring 整合]
编辑 1:
我正在呼叫外部服务。它可以给出如下错误信息
{
"code": "F01",
"userMessage": "The is some data error....",
"parameters": {}
}
在我将错误处理程序添加到 http-outbound-gateway 之前,我总是收到 "Bad Request" 的响应 [并且缺少像上面那样的明确消息]
添加错误处理程序和 class 后,我可以转发外部服务在其响应主体中提供的任何错误消息。这是可以接受的,但我在 handleError 中没有任何实现 [就像你回答的那样]。在这种情况下,有没有办法摆脱这个 class 并利用任何 OOTB class?因为我没有理由解释为什么它在那里[可能是我不明白它的重要性]。
P.S。 @Artem Bilan,你的回答可能就足够了[如果我需要class来解决我的问题]
不清楚你的问题是什么,但我会尝试解释一些事情。
您绝对可能不需要那个自定义 ErrorHandler
,因为默认的非常好,最后它只是这样做:
protected void handleError(ClientHttpResponse response, HttpStatus statusCode) throws IOException {
String statusText = response.getStatusText();
HttpHeaders headers = response.getHeaders();
byte[] body = getResponseBody(response);
Charset charset = getCharset(response);
switch (statusCode.series()) {
case CLIENT_ERROR:
throw HttpClientErrorException.create(statusCode, statusText, headers, body, charset);
case SERVER_ERROR:
throw HttpServerErrorException.create(statusCode, statusText, headers, body, charset);
default:
throw new UnknownHttpStatusCodeException(statusCode.value(), statusText, headers, body, charset);
}
}
因此,它解析响应并向调用者抛出相应的异常。
如果您在调用该 REST 服务时需要以某种方式对这个或那个异常做出反应,您需要考虑对 <int-http:outbound-gateway>
使用 ExpressionEvaluatingRequestHandlerAdvice
。这样,从 DefaultResponseErrorHandler
传播的异常可以发送到某些 failureChannel
,以获得可能的逻辑如何对此异常做出反应。
在文档中查看更多信息:https://docs.spring.io/spring-integration/docs/current/reference/html/#message-handler-advice-chain
如果这不是您所期望的,请重新表述您的问题,因为我还不清楚...
谢谢理解。