当前位置: 首页 > 知识库问答 >
问题:

JSR-349 Spring@RestController与Spring Boot的bean验证

公良高刚
2023-03-14

我正在使用Spring Boot 1.5.2。RELEASE和不能合并JSR-349(bean验证1.1)的@recestParam

对于POST请求,如果方法参数是Java POJO,那么用@Valid注释该参数可以正常工作,但注释@RequestParam

我有带注释的控制器类与Spring的@验证

关于这个问题有很多问题,我已经评论过这个答案,它对我不起作用。

Spring Boot包括-validation-api-1.1.0。最终的jar和hibernate-validator-5.3.4。最终的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; 
}

当我为电子邮件

@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;
}

响应


共有2个答案

邢新
2023-03-14

添加@Validated时,Spring@Validated@Controller未映射。从控制器本身删除任何继承都会有所帮助。除此之外,萨比尔·汗的回答起了作用,确实起到了帮助。

富锦
2023-03-14

经过两天多的失败,我问了这个问题

最后,这篇文章帮了大忙。

我分两步解决问题,

1.将以下bean添加到我的配置中——如果没有这些bean,任何事情都不会起作用。

@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的“验证注释”,

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

已验证的是-org。springframework。验证。注释。已验证

此设置不会影响同一控制器中的@RequestBody验证的@Valid注释,以及那些继续正常工作的注释。

所以现在,我可以触发类似下面的验证方法在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

 类似资料:
  • 我的bean中有两个字段 当字段key=“A”,“value”应该跟在其他“key”的特定Regex后面时,它可以是任何内容。 如何根据键定义此值验证。

  • 我使用Spring 3.2.2与Primeface 4.0和Hibernate 4.2。我在我的实体上有JSR303验证注释,并且我配置了Spring来在服务层验证它们——这很好。 但是我希望在调用服务之前启动JSF验证,但事实并非如此。我所做的所有研究都表明,我只需在类路径中添加一个验证程序,JSF2就会自动应用。 我已将建议的JAR添加到我的类路径中: 完整的依赖关系树可以在https://g

  • 我正在使用: PrimeFaces 6.1 JSF:2.2.10 javax.validation:1.1.0.final 验证程序IMPL:hibernate-validator 5.0.1.final GAE:1.9.52 以下是使用后端bean进行CSV(客户端验证)的示例:https://www.primefaces.org/showcase/ui/CSV/bean.xhtml 我现在得到

  • 这是用Kotlin编写的User类: 这就是测试: 无效的角色映射为NULL。 这里有一个示例项目,以防您想尝试一些东西。

  • 我试图让Kotlin在spring-data-rest项目上使用JSR303验证。 给定以下数据类声明: 提前感谢您的帮助!