我有一个由 URL 配置错误引起的场景
@Bean
ExpressionEvaluatingRequestHandlerAdvice notFoundAdvice() {
final ExpressionEvaluatingRequestHandlerAdvice advice =
new ExpressionEvaluatingRequestHandlerAdvice();
advice.setOnFailureExpressionString(
"#exception.getCause()"
+ " instanceof T(org.springframework.web.client.HttpClientErrorException.NotFound)"
+ " ? '{ \"value\": null }' : payload"
);
advice.setReturnFailureExpressionResult(true);
return advice;
}
@Bean
public IntegrationFlow myIntegrationFlow(final RestTemplate restTemplate) {
return f -> f
f.enrich(
e -> e.requestSubFlow(
sf -> sf
.handle(
Http.outboundGateway(misconfiguredUrl, restTemplate)
.httpMethod(HttpMethod.GET)
.uriVariable("productId", "headers.productId")
.mappedResponseHeaders()
.expectedResponseType(String.class),
ec -> ec.advice(notFoundAdvice())
)
)
.propertyExpression("productData", "#jsonPath(payload, '$.value')")
)
);
}
显然这是过于做作了,但是如果misconfiguredUrl
说不包括http://host
URL 的部分,这将导致 URL 失败。
我没有看到这个特定的错误爆发,但没有找到#jsonPath(...)
失败。$[value]
在这种情况下,是否有一些配置可用于从 outboundGateway 记录错误?
编辑:
在评论交流之后,我意识到我已经 (1) 省略了处理“合法”404 错误 (2) 情况的端点配置,这样做发现我设置setReturnFailureExpressionResult
了不正确的。
删除setReturnFailureExpressionResult
设置更正了问题并显示了错误。
EDIT2:所以我很快就谈过了,并没有完全测试这一点。
虽然这显示了错误,但它不允许我专门捕获一种情况(404)并返回默认值,同时仍然允许其他调用正常失败并出现异常。
我可能不得不在这里重新考虑一下这种方法。
EDIT3:实现了一个自定义处理类
public class CustomNotFoundAdvice extends AbstractRequestHandlerAdvice {
private static final Logger log = LoggerFactory.getLogger(CustomNotFoundAdvice.class);
final Object defaultReturn;
public CustomNotFoundAdvice(final Object defaultReturn) {
this.defaultReturn = defaultReturn;
}
@Override
protected Object doInvoke(ExecutionCallback callback, Object target, Message<?> message) {
Object result;
try {
result = callback.execute();
}
catch(RuntimeException ex) {
final Exception realException = unwrapExceptionIfNecessary(ex);
if( realException instanceof MessageHandlingException
&& realException.getCause() instanceof HttpClientErrorException.NotFound) {
log.warn("Unable to locate object "+target);
result = defaultReturn;
}
else {
throw ex;
}
}
return result;
}
}