2015-07-04 181 views
1

什麼是在Spring集成中進行驗證的最佳方式。 例如,如果我們有入站網關,當收到消息時,我們要驗證它。如果無效 - >將驗證錯誤返回給網關,否則 - >繼續執行應用程序的正常流程(變換,句柄...)。彈簧集成驗證

我嘗試了過濾器:

 @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(可以是一個變壓器)來獲得錯誤。

有沒有更好的辦法?

回答

1
.handle(new ValidationHandler()) 

您並不需要爲每個錯誤創建一個新的處理程序。

在您的過濾器中,如果驗證失敗,請拋出MyValidationException(errors)

在網關的錯誤信道上的錯誤流程中,ErrorMessage具有的有效載荷是一個MessagingExceptionMyValidatationException作爲其原因以及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) { 
    ... 
} 
+0

感謝您的回答,加里。還有一件事:如果網關是'HttpRequestHandlingMessagingGateway',有沒有辦法返回'400 BadRequest'? –

+0

發現它:GW通過'http_statusCode'標頭解析http狀態。所以:在處理程序'返回MessageBuilder.withPayload( 「一些錯誤」) \t \t \t .setHeader( 「http_statusCode」, 「400」) \t \t \t .build();' –