我使用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();
}
答案 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
即。将验证和过滤器问题分开。