小编典典

JSR-使用Spring Boot对Spring @RestController进行349 bean验证

spring-boot

我正在使用Spring Boot
1.5.2.RELEASE,并且无法为@RequestParam@PathVariableat方法本身合并JSR-349(bean验证1.1)。

对于POST请求,如果方法参数是Java
POJO,则使用对该参数进行注释@Valid可以正常工作,但使用@RequestParam@PathVariable进行注释@NotEmpty,则@Email不能正常工作。

我已经用Spring注释了控制器类 @Validated

Spring Boot包括- validation-api-1.1.0.Final.jarhibernate- validator-5.3.4.Final.jar

我有什么想念的吗?

示例代码

@RequestMapping(method = RequestMethod.GET, value = "/testValidated", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseBean<String> testValidated(@Email @NotEmpty @RequestParam("email") String email) {
    ResponseBean<String> response = new ResponseBean<>();
    response.setResponse(Constants.SUCCESS);
    response.setMessage("testValidated");
    logger.error("Validator Not called");
    return response; 
}

当我发送空值或格式不正确的电子邮件地址时,永远不会调用下面的处理程序,并且email控制权始终与in testValidated方法一起使用。

@ExceptionHandler(ConstraintViolationException.class)
@ResponseBody
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ResponseBean handle(ConstraintViolationException exception) {

    StringBuilder messages = new StringBuilder();
    ResponseBean response = new ResponseBean();

    exception.getConstraintViolations().forEach(entry -> messages.append(entry.getMessage() + "\n"));

    response.setResponse(Constants.FAILURE);
    response.setErrorcode(Constants.ERROR_CODE_BAD_REQUEST);
    response.setMessage(messages.toString());
    return response;
}

ResponseBean<T> 是我的应用程序特定的类。


阅读 356

收藏
2020-05-30

共1个答案

小编典典

经过两天以上的成功命中和审判,我问了这个问题。由于对Spring验证和JSR验证,Spring如何调用JSR验证器,JSR标准中的更改以及所支持的验证类型感到困惑,因此出现了许多令人困惑的答案。

最后,这篇文章对我们很有帮助。

我分两步解决了问题,

1.在我的豆子中添加了以下豆子Configuration-没有这些豆子,将无法正常工作。

@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
    MethodValidationPostProcessor mvProcessor = new MethodValidationPostProcessor();
    mvProcessor.setValidator(validator());
    return mvProcessor;
}

@Bean
public LocalValidatorFactoryBean validator() {
    LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
    validator.setProviderClass(HibernateValidator.class);
    validator.afterPropertiesSet();
    return validator;
}

2.将Spring的@Validated注释放置在我的控制器上,如下所示,

@RestController
@RequestMapping("/...")
@Validated
public class MyRestController {
}

验证为- org.springframework.validation.annotation.Validated

此设置不会影响在同一控制器中@Valid进行@RequestBody验证的注释,并且注释仍将继续工作。

因此,现在,我可以针对MyRestController类中的方法触发以下验证,

@RequestMapping(method = RequestMethod.GET, value = "/testValidated" , consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseBean<String> testValidated(
        @Email(message="email RequestParam is not a valid email address") 
        @NotEmpty(message="email RequestParam is empty") 
        @RequestParam("email") String email) {
    ResponseBean<String> response = new ResponseBean<>();
    ....
    return response; 
}

我必须在异常处理程序中添加另一个处理程序以处理异常-
ConstraintViolationException尽管由于在@Validated抛出时@Valid会抛出此异常MethodArgumentNotValidException

2020-05-30