2017-01-10 4 views
0

@ResponseBody(私の場合はSomePojoInterface型のクラス)が自動的に検証されます(JSR-303の検証を通じて)。うまくいけば、妥当性検査の失敗の場合、ハンドラはExceptionを投げ、それは@ControllerAdvice注釈付きクラスで処理することができます。@RestController:@ResponseBody(@RequestBodyではない)を確認する

これまでのコードです。

@RestController 
public class MyRestController { 

    @GetMapping(value = "validate", produces = MediaType.APPLICATION_JSON_VALUE) 
    @ResponseBody 
    protected SomePojo validateResponse() { 
     return new SomePojo(); 
    } 
} 

@ControllerAdvice 
class GlobalControllerExceptionHandler { 

    @ResponseStatus(HttpStatus.XXX) 
    @ExceptionHandler(MyResponseValidationException.class) 
    public void handleResponseValidationException() { 
     // ... 
    } 
} 

public class SomePojo implements SomePojoInterface { 

    @NotNull 
    private String someValue; 

    // getter/setter 
} 
+0

いくつかの例で試しましたか?これはhttps://www.petrikainulainen.net/programming/spring-framework/spring-from-the-trenches-adding-validation-to-a-rest-api/のようなものです。 Spring 3.2では@Validアノテーションを追加できます;) – Hrabosch

+0

@Validアノテーションはどこに置くべきですか?私は応答オブジェクトを検証するつもりです。 – user871611

+0

ああ、レスポンスです!次に、バリデータを作成する必要があります。私はアンサーを投稿します – Hrabosch

答えて

0

@RestControllerAdviceでこれを達成できました。

@RestControllerAdvice 
public class RestPostProcessingAdvice implements ResponseBodyAdvice<SomePojoInterface> { 

    @Inject 
    private Validator validator; 

    @Override 
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) { 
     if(doSomeChecksIfEligiable(returnType, converterType)) { 
      return true; 
     } 
     return false; 
    } 

    @Override 
    public SomePojoInterface beforeBodyWrite(SomePojoInterface body, MethodParameter returnType, 
      MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, 
      ServerHttpRequest request, ServerHttpResponse response) { 
     Set<ConstraintViolation<Object>> constraintViolations = validator.validate(body); 
     if(constraintViolations.size() > 0) { 
      response.setStatusCode(HttpStatus.XXX); 
      LOG.fatal("Sorry, I'm sending crap"); 
     } 

     return body; 
    } 
} 

オブジェクトが再びこの@RestControllerAdviceをチェックされますので、@ResponseBodyでoutオブジェクト(mofified)同じを送信している@ExceptionHandlerExceptionを投げ、それをキャッチすると、無限ループにつながる可能性があることに注意してください。

0

あなたのクラスSomePojoを注釈を付けている場合は、:

 @GetMapping(value = "validate", produces = MediaType.APPLICATION_JSON_VALUE) 
     protected SomePojo validateResponse() { 
      ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); 
      Validator validator = factory.getValidator(); 

      SomePojo somePojo = new SomePojo(null); 

      Set<ConstraintViolation<Car>> constraintViolations = validator.validate(somePojo); 
      // Other stuff 
     } 

@Valid注釈が要求のためです。より多くの例がdocsです。あなたが妥当性を確認したいものが何であるか分かりません

+0

が要求に使用されます。裏付けされたものはレスポンスを生成するので、うまくいけば作成できます(クラス不変式) –

+0

@Hrabosh、私は検証する方法を知っています。私はいくつかの段階でこれをバックグラウンドで行うためにトリガできるハンドラを指していました。 – user871611

+0

@ user871611それから私は知らない。リクエストのために '@ Valid'でそれを知っていますが、レスポンスのために私は他の方法を知らないので、私はこれを答えました。 – Hrabosch

関連する問題