【发布时间】:2020-12-02 08:59:02
【问题描述】:
我的流程中有以下句柄:
.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);
它从不抛出异常,所以我猜这就是不调用失败表达式的原因?
【问题讨论】:
标签: spring spring-integration spring-integration-dsl