Spring 集成验证

Spring Integration validation

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

我尝试了一个过滤器:

        @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();
        }

它可以工作,但是如果我使用 spring validator,那么我必须调用它两次,在过滤器和 ValidationHandler(可以是转换器)中以获取错误。

有什么更好的方法吗?

.handle(new ValidationHandler())

您真的不需要为每个错误创建新的处理程序。

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

在网关错误通道上的错误流中,ErrorMessage 的负载是 MessagingException,其原因是 MyValidatationExceptionfailedMessage .

类似...

.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();
            ...
        }
    }
}

或者您可以使用 POJO messageHandler

public Object handle(MessagingException e) {
    ...
}