【问题标题】:Spring Integration validationSpring 集成验证
【发布时间】:2015-07-05 02:00:15
【问题描述】:

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

我尝试了一个过滤器:

        @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(可以是转换器)中调用它两次以获取错误。

有更好的方法吗?

【问题讨论】:

    标签: java spring validation spring-integration


    【解决方案1】:
    .handle(new ValidationHandler())
    

    您实际上不需要为每个错误创建一个新的处理程序。

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

    在网关错误通道上的错误流中,ErrorMessage 的负载是 MessagingExceptionMyValidatationException 是其原因,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();
                ...
            }
        }
    }
    

    或者你可以使用 POJO messageHandler

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

    【讨论】:

    • 谢谢你的回答,加里。还有一件事:如果网关是HttpRequestHandlingMessagingGateway,有没有办法返回400 BadRequest
    • 找到了:GW通过http_statusCode标头解析http状态。所以:在处理程序return MessageBuilder.withPayload("some error") .setHeader("http_statusCode", "400") .build();
    猜你喜欢
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 2017-06-18
    • 2017-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多