在 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 (可以是转换器)中调用它两次才能获取错误。
还有什么更好的办法吗?
最佳答案
.handle(new ValidationHandler())
您实际上并不需要为每个错误创建一个新的处理程序。
在过滤器中,如果验证失败,则抛出 MyValidationException(errors)
。
在网关错误 channel 上的错误流中,ErrorMessage
的有效负载是 MessagingException
,其原因是 MyValidatationException
,和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) {
...
}
关于java - Spring集成验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31222373/