Spring 集成 JPA 网关:处理空结果
Spring Integration JPA Gateway: act on empty result
我的流程中有以下句柄:
.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 查询 returns 没有结果。我需要为此实施建议吗?如果是,如何获取查询返回空结果的信息?
更新
根据 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
a ReplyRequiredException
。
然后 ExpressionEvaluatingRequestHandlerAdvice
可能有一个 onFailureExpression
和 returnFailureExpressionResult
到 return 例如一个空列表。
更新
我收回我的 ExpressionEvaluatingRequestHandlerAdvice
建议。
我们有这样的代码:
Object result = callback.execute();
if (this.onSuccessExpression != null) {
evaluateSuccessExpression(message);
}
return result;
callback.execute()
returns null
对我们来说,我们不关心它,只是 return 它是。 ReplyRequiredException
稍后抛出。所以,这个确实符合我们的 null reply
要求。
我建议您通过检查 callback.execute()
isstead 的结果来实现自己的 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;
}
};
}
我的流程中有以下句柄:
.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 查询 returns 没有结果。我需要为此实施建议吗?如果是,如何获取查询返回空结果的信息?
更新
根据 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
a ReplyRequiredException
。
然后 ExpressionEvaluatingRequestHandlerAdvice
可能有一个 onFailureExpression
和 returnFailureExpressionResult
到 return 例如一个空列表。
更新
我收回我的 ExpressionEvaluatingRequestHandlerAdvice
建议。
我们有这样的代码:
Object result = callback.execute();
if (this.onSuccessExpression != null) {
evaluateSuccessExpression(message);
}
return result;
callback.execute()
returns null
对我们来说,我们不关心它,只是 return 它是。 ReplyRequiredException
稍后抛出。所以,这个确实符合我们的 null reply
要求。
我建议您通过检查 callback.execute()
isstead 的结果来实现自己的 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;
}
};
}