具有异常的Spring集成过滤器

时间:2018-03-11 00:29:45

标签: java spring validation spring-integration spring-integration-dsl

我使用SpringIntegration-filter来验证我的WS消息。我实现验证器验证,如果WS消息有效,它们返回true。但是如果WS消息无效,则会抛出MyValidationException。

使用SpringIntegration-filter有办法处理这种异常吗?如果我没有返回false,则过滤器不起作用。

我的代码示例如下。我想在丢弃流程中使用我的验证异常。

@Bean
public IntegrationFlow incomingRequest() {
    return f -> f
        .<IncomingRequest>filter(message ->
            validatorFactory.validator(message.getName())
                .validate(message),
            filterEndpointSpec -> 
                filterEndpointSpec.discardChannel(discardChannel()))
        .<IncomingRequest>handle((payload, headers) ->
            applicationService.handle(payload));
}

@Bean
public IntegrationFlow discard() {
    return IntegrationFlows.from(discardChannel())
        .log("DISCARD FLOW")
        .get();
}

@Bean(name = "discard.input")
public MessageChannel discardChannel() {
    return MessageChannels.direct().get();
}

2 个答案:

答案 0 :(得分:2)

鉴于在检查WS请求时从验证中发出异常,您必须在try catch中包围该调用。如果抛出异常,则会捕获它并返回false,表示验证失败。

@Bean
public IntegrationFlow incomingRequest2() {
    return f -> f
            .filter(this::isValid, filterEndpointSpec -> 
                    filterEndpointSpec.discardFlow(f2 -> f2.transform(this::getReason))
                            .discardChannel(discardChannel()))
            .<IncomingRequest>handle((payload, headers) ->
                    applicationService.handle(payload));
}

辅助方法。

public boolean isValid(IncomingRequest message) {
    try {
        return validatorFactory.validator(message.getName())
                .validate(message);
    } catch (Exception e) { // your exception
        return false;
    }
}

public String getReason(IncomingRequest message) { // return the object you need
    try {
        validatorFactory.validator(message.getName())
                .validate(message);
        return null;
    } catch (Exception e) { // process exception as you want
        return e.getMessage(); 
    }
}

答案 1 :(得分:1)

丢弃渠道只获取被拒绝的入站消息;没有办法在过滤器中改变它。

你可以这样做......

.handle()   // return an Exception on validation failure
.filter(...) // filter if payload is exception; the exceptions go to the discard channel

即。将验证和过滤器问题分开。