gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:54:48 24 4
gpt4 key购买 nike

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

对于 POST 请求,如果方法参数是 Java POJO,则用 @Valid 注释该参数工作正常但注释 @RequestParam & @PathVariable用类似 @NotEmpty 的东西, @Email不工作。

我已经用 Spring 的 @Validated 注释了 Controller 类

关于SO的问题很多,我在this answer上发表了评论它不适合我。

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 发送空值或格式不正确的电子邮件地址时,永远不会调用以下处理程序& 控制总是在 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>是我的应用程序特定类。

最佳答案

经过两天多的点击和试用失败后,我提出了这个问题。由于围绕 Spring Validations 和 JSR 验证、Spring 如何调用 JSR validator 、JSR 标准的更改以及支持的验证类型存在混淆,因此存在许多令人困惑的答案。

最后,this article帮助很大。

我分两步解决了问题,

1. 将以下 bean 添加到我的 Configuration - 没有这些 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.在我的 Controller 上放置 Spring 的 @Validated 注释,如下所示,

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

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

此设置不影响同一 Controller 中用于 @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

关于java - JSR - Spring Boot 的 Spring @RestController 的 349 bean 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44320678/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com