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
,其原因是 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) {
...
}
在 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
,其原因是 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) {
...
}