我的流中有以下句柄:
.handle(Jpa.retrievingGateway(this.sourceEntityManagerFactory)
.entityClass(DocumentHeader.class)
.jpaQuery("from DocumentHeader d where d.modifiedDate > :modified")
.parameterExpression("modified", "payload")
.maxResults(maxResults), e -> e.id("retrieveDocumentHeader"))
.channel(Channels.DOCUMENT_HEADER.name())
如果jpa查询没有返回结果,我想做点什么。我需要为此执行建议吗?如果是,如何获取查询返回空结果的信息?
更新
根据Artem的建议,我提出了以下建议:
@Bean
public Advice returnEmptyResultForAdvice() {
ExpressionEvaluatingRequestHandlerAdvice advice = new ExpressionEvaluatingRequestHandlerAdvice();
advice.setOnFailureExpressionString("new java.util.ArrayList(0)");
advice.setReturnFailureExpressionResult(true);
return advice;
}
网关:
.handle(Jpa.retrievingGateway(this.sourceEntityManagerFactory)
.entityClass(DocumentHeader.class)
.jpaQuery("from DocumentHeader d where d.modifiedDate > :modified")
.parameterExpression("modified", "payload")
.maxResults(maxResults), e -> e.id("retrieveDocumentHeader")
.advice(this.advices.returnEmptyResultForAdvice()).requiresReply(true))
但它给了我以下错误:
2020-08-13 19:13:57.474 ERROR 5552 --- [ask-scheduler-1] o.s.integration.handler.LoggingHandler : org.springframework.integration.handler.ReplyRequiredException: No reply produced by handler 'retrieveDocumentHeader', and its 'requiresReply' property is set to true....]
更新2
我对ExpressionEvaluatingRequestHandlerAdvice进行了更多的调试
protected Object doInvoke(ExecutionCallback callback, Object target, Message<?> message) {
try {
Object result = callback.execute();
if (this.onSuccessExpression != null) {
this.evaluateSuccessExpression(message);
}
return result;
} catch (RuntimeException var7) {
Exception actualException = this.unwrapExceptionIfNecessary(var7);
if (this.onFailureExpression != null) {
Object evalResult = this.evaluateFailureExpression(message, actualException);
它从不抛出异常,所以我想这就是为什么没有调用失败表达式的原因吧?
此功能尚未实现:https://jira.spring.io/browse/INT-3333
然而,当您将此建议添加到e
(端点配置器(及其requiresReply(true)
选项中时,您可以使用ExpressionEvaluatingRequestHandlerAdvice
捕获ReplyRequiredException
。
则该ExpressionEvaluatingRequestHandlerAdvice
可以具有onFailureExpression
和returnFailureExpressionResult
以返回例如空列表。
更新
我收回了ExpressionEvaluatingRequestHandlerAdvice
的建议。我们有这样的代码:
Object result = callback.execute();
if (this.onSuccessExpression != null) {
evaluateSuccessExpression(message);
}
return result;
callback.execute()
为我们返回null
,我们不在乎,只按原样返回。ReplyRequiredException
稍后抛出。因此,这个确实符合我们的null reply
要求。
我建议你通过检查callback.execute()
的结果来实现你自己的AbstractRequestHandlerAdvice
。
示例建议:
@Bean
public Advice verifyEmptyResult() {
return new AbstractRequestHandlerAdvice() {
@Override
protected Object doInvoke(ExecutionCallback callback, Object target, Message<?> message) {
Object executed = callback.execute();
if (executed == null)
return new ArrayList<>();
else
return executed;
}
};
}