Java Spring集成验证

Java Spring集成验证,java,spring,validation,spring-integration,Java,Spring,Validation,Spring Integration,在Spring集成中进行验证的最佳方法是什么。 例如,如果我们有一个入站网关,当收到一条消息时,我们希望验证它。如果无效->将验证错误返回到网关,否则->继续应用程序的正常流程(转换、处理…) 我尝试了一个过滤器: @Bean public IntegrationFlow flow() { return IntegrationFlows.from(requestChannel()) .transfor

在Spring集成中进行验证的最佳方法是什么。 例如,如果我们有一个入站网关,当收到一条消息时,我们希望验证它。如果无效->将验证错误返回到网关,否则->继续应用程序的正常流程(转换、处理…)

我尝试了一个过滤器:

        @Bean
        public IntegrationFlow flow() {
            return IntegrationFlows.from(requestChannel())
                    .transform(new MapToObjectTransformer(Campaign.class))
                    .filter(Campaign.class, 
                            c -> c.getId() > 10 ? true : false, //if id > 10 then it's valid
                            e -> e.discardChannel(validationError()))
                    .handle(new MyHandler())
                    .get();
        }

        @Bean
        public IntegrationFlow validationErrorFlow() {
            return IntegrationFlows.from(validationError())
                    .handle(new ValidationHandler())//construct a message with the validation errors
                    .get();
        }
它是有效的,但是如果我使用了,那么我必须在过滤器和ValidationHandler(可以是一个转换器)中调用它两次以获取错误

还有更好的办法吗

.handle(new ValidationHandler())
您实际上不需要为每个错误创建新的处理程序

在过滤器中,如果验证失败,则抛出
MyValidationException(errors)

在网关错误通道上的错误流中,
ErrorMessage
的有效负载是
MessaginException
,原因是
MyValidationException
,而
failedMessage

类似于

.handle(validationErrorHandler())

...

@Bean
public MessageHandler validationErrorHandler() {
    return new AbstractReplyProducingMessageHandler() {
        public Object handleRequestMessage(Message<?> error) {
            MyValidationException myEx = (MyValidationException) 
                  ((ErrorMessage) error).getPayload.getCause();
            Errors errors = myEx.getErrors();
            ...
        }
    }
}

谢谢你的回答,加里。还有一件事:如果网关是
HttpRequestHandlingMessagingGateway
是否有方法返回
400 BadRequest
?找到它:GW通过
http\u statusCode
头解析http状态。因此:在处理程序
中返回MessageBuilder.withPayload(“some error”).setHeader(“http_statusCode”,“400”).build()
public Object handle(MessagingException e) {
    ...
}