Spring Integration JPA网关:对空结果执行操作



我的流中有以下句柄:

.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可以具有onFailureExpressionreturnFailureExpressionResult以返回例如空列表。

更新

我收回了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;
}
};
}

最新更新