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 可能有一个 onFailureExpressionreturnFailureExpressionResult 到 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;
        }
    };
}