Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring集成JPA网关:根据空结果操作_Spring_Spring Integration_Spring Integration Dsl - Fatal编程技术网

Spring集成JPA网关:根据空结果操作

Spring集成JPA网关:根据空结果操作,spring,spring-integration,spring-integration-dsl,Spring,Spring Integration,Spring Integration Dsl,我的流中有以下句柄: .handle(Jpa.retrievingGateway(this.sourceEntityManagerFactory) .entityClass(DocumentHeader.class) .jpaQuery("from DocumentHeader d where d.modifiedDate > :modified")

我的流中有以下句柄:

.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查询不返回任何结果。我是否需要为此提供建议?如果是,我如何获得查询返回空结果的信息

更新

根据阿泰姆的建议,我提出了以下建议:

    @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

我对ExpressionEvaluationRequestHandlerAdvice进行了更多的调试

受保护对象doInvoke(ExecutionCallback回调、对象目标、消息){
试一试{
对象结果=callback.execute();
if(this.onSuccessExpression!=null){
此.evaluateSuccessExpression(消息);
}
返回结果;
}捕获(RuntimeException var7){
Exception actualException=this.UnwapeException如果需要(var7);
if(this.onFailureExpression!=null){
Object evalResult=this.evaluateFailureExpression(消息、actualException);

它从不引发异常,因此我想这就是为什么没有调用失败表达式的原因?

此功能尚未实现:

但是,当您将此建议添加到
e
(端点配置器)及其
requiresReply(true)
选项中时,您可以使用
表达式evaluation requestHandlerAdvice
捕获
回复请求异常

然后,
expressionevaluationrequesthandleradvice
可能有一个
onFailureExpression
returnFailureExpressionResult
来返回例如一个空列表

更新

我收回了我的
表达评估请求的建议。
我们有这样的代码:

Object result = callback.execute();
if (this.onSuccessExpression != null) {
    evaluateSuccessExpression(message);
}
return result;
callback.execute()
为我们返回
null
,我们不关心这一点,只是按原样返回它。
ReplyRequiredException
稍后抛出。因此,这个确实满足了我们的
null reply
要求

我建议您实现自己的
AbstractRequestHandlerAdvice
,检查
回调的结果。execute()
isntead。

示例建议:

@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;
        }
    };
}
@Bean
公共建议验证EmptyResult(){
返回新的AbstractRequestHandlerAdvice(){
@凌驾
受保护对象doInvoke(ExecutionCallback回调、对象目标、消息){
objectexecuted=callback.execute();
if(已执行==null)
返回新的ArrayList();
其他的
已执行的返回;
}
};
}

谢谢你的建议。你能看一下我帖子中的更新吗?你能在
表达式评估请求HandlerAdvice
中放置一个断点,以确定如何评估
onFailureExpression
以及接下来会发生什么?因此,在引导过程中正确评估表达式,但我不知道是什么原因还有,我应该在网关执行时设置断点来调试它吗?有什么想法吗?嗨,Artem,有没有进一步调试它的想法?如果我不能很快解决它,我会考虑切换到spring data repository的正常句柄。好的。我今天就调试它。听起来好像没有应用这个建议。。。
@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;
        }
    };
}