2017-09-06 97 views
1

我有一個控制器與一個getMapping和pathValue方法:春季啓動HTTP GET自定義驗證

@ResponseBody 
@Validated 
@GetMapping(produces = [MediaType.APPLICATION_JSON_UTF8_VALUE], 
value = '/{person}') 
PersonResponse getPersonInfo (
    @Valid @PersonValidation 
    @PathVariable('person') String personId, 
    BindingResult bindingResult 
    ) { 
// Abort if received data is not valid 
    if (bindingResult.hasErrors()) { 
     throw new BadHttpRequest() 
} 

我所試圖達到使用我的自定義驗證@PersonValidation被驗證的URI PERSONID,但它無法正常工作,代碼沒有給出任何錯誤,但程序永遠不會進入我的自定義驗證類...

¿我該如何解決這個問題? ¿我如何使用自定義驗證驗證我的路徑變量?

回答

1

我已經解決了我的問題。春天有一些問題,以驗證路徑變量... 首先,你需要用MethodValidationPostProcessor添加配置類像這樣的:

/** 
* this class is required to use our custom path variable validation on 
* the controller class 
*/ 
@Configuration 
class ValidatorConfiguration { 

    @Bean 
    MethodValidationPostProcessor methodValidationPostProcessor() { 
    return new MethodValidationPostProcessor() 
    } 
} 

現在,在控制器類,它添加@Validated註釋是非常重要的

@RestController 
@Validated 
class YourController class { 
} 

現在的路徑變量您的自定義驗證是要去工作,如果你想捕獲異常,添加此方法在您的控制器:

@ControllerAdvice 
class GlobalExceptionHandler { 
    @ExceptionHandler(value = [ ConstraintViolationException.class ]) 
    @ResponseStatus(value = HttpStatus.BAD_REQUEST) 
    String handle(ConstraintViolationException e) { 
     Set<ConstraintViolation<?>> violations = e.getConstraintViolations() 
     StringBuilder strBuilder = new StringBuilder() 
     for (ConstraintViolation<?> violation : violations) { 
      strBuilder.append(violation.getMessage() + "\n") 
     } 
     return strBuilder.toString() 
    } 
}