Java Spring集成验证
在Spring集成中进行验证的最佳方法是什么。 例如,如果我们有一个入站网关,当收到一条消息时,我们希望验证它。如果无效->将验证错误返回到网关,否则->继续应用程序的正常流程(转换、处理…) 我尝试了一个过滤器:Java Spring集成验证,java,spring,validation,spring-integration,Java,Spring,Validation,Spring Integration,在Spring集成中进行验证的最佳方法是什么。 例如,如果我们有一个入站网关,当收到一条消息时,我们希望验证它。如果无效->将验证错误返回到网关,否则->继续应用程序的正常流程(转换、处理…) 我尝试了一个过滤器: @Bean public IntegrationFlow flow() { return IntegrationFlows.from(requestChannel()) .transfor
@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();
}
它是有效的,但是如果我使用了,那么我必须在过滤器和ValidationHandler(可以是一个转换器)中调用它两次以获取错误
还有更好的办法吗
.handle(new ValidationHandler())
您实际上不需要为每个错误创建新的处理程序
在过滤器中,如果验证失败,则抛出MyValidationException(errors)
在网关错误通道上的错误流中,ErrorMessage
的有效负载是MessaginException
,原因是MyValidationException
,而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();
...
}
}
}
谢谢你的回答,加里。还有一件事:如果网关是
HttpRequestHandlingMessagingGateway
是否有方法返回400 BadRequest
?找到它:GW通过http\u statusCode
头解析http状态。因此:在处理程序中返回MessageBuilder.withPayload(“some error”).setHeader(“http_statusCode”,“400”).build()代码>
public Object handle(MessagingException e) {
...
}