springboot使用hibernate validator校验
2020-01-13 21:30
281 查看
hibernate validator Bean验证器在开发中常用,这里我们说说它在springboot中的使用
第一步:引入配置
@Bean public MethodValidationPostProcessor methodValidationPostProcessor() { MethodValidationPostProcessor postProcessor = new MethodValidationPostProcessor(); /**设置validator模式为快速失败返回*/ postProcessor.setValidator(validator()); return postProcessor; } @Bean public Validator validator(){ //hibernate.validator.fail_fast=false 设置为普通模式返回 //hibernate.validator.fail_fast=true 设置为快速模式返回 ValidatorFactory validatorFactory = Validation.byProvider( HibernateValidator.class ) .configure() .addProperty("hibernate.validator.fail_fast", "false" ) .buildValidatorFactory(); Validator validator = validatorFactory.getValidator(); return validator; }
它有两种模式返回,一种普通模式,就是所有的属性都要验证,并把错误信息返回,其余一种是快速模式,这种模式是遇到错误就返回,剩下的就不检查了。
第二步:就是使用的问题了
我们使用有两种情况,就是传参的时候我们会传入一个Bean对象或者是单个参数,此时我们处理就分两种情况了。
我们首先看传Bean对象,此时怎么处理。
先建个Bean对象:
import lombok.Data; import org.hibernate.validator.constraints.NotBlank; import javax.validation.Valid; import javax.validation.constraints.NotNull; /** * 我们定义个bean、 * Created by mingge on 2018/5/24. */ @Data public class NewInfoParam { @NotNull(message = "ID不能为空") private Long id; @NotBlank(message = "名字不能为空") private String name; }
然后在控制层中使用:
@PostMapping("/test") public ExtendVO test(@Valid @RequestBody NewInfoParam p, BindingResult result){ try { if(result.hasErrors()){ for (ObjectError error : result.getAllErrors()) { throw new Exception(error.getDefaultMessage()); } } return VOUtils.returnExtendVOSuccess(true); } catch (Exception e) { e.printStackTrace(); return VOUtils.returnExtendVOError(CodeEnum.ERROR, null); } }
这里演示BindingResult result这个不是必须的,我们可以通过控制层抛出异常,对其进行统一处理。
第二种就是单个属性验证了:
@PostMapping("/test1") public ExtendVO testGet(@NotNull(message = "年龄不能为空") Integer age){ try{ return VOUtils.returnExtendVOSuccess(true); }catch (Exception e){ e.printStackTrace(); return VOUtils.returnExtendVOError(CodeEnum.ERROR, null); } }
还有就是你需要在这个类上加上:
@Validated 才有效
@GetMapping("/test") public ExtendVO test(@RequestParam(name = "name") String name){ try { return VOUtils.returnExtendVOSuccess(true); } catch (Exception e) { e.printStackTrace(); return VOUtils.returnExtendVOError(CodeEnum.ERROR, null); } }
以上这段是springmvc自带的,异常最后处理还是在统一抛出来处理
最后,你需要配置全局统一异常处理:**
* Created by 异常处理 on 2018/5/24. */ @ControllerAdvice @Component public class GlobalExceptionHandler { @ExceptionHandler @ResponseBody @ResponseStatus(HttpStatus.BAD_REQUEST) public String handle(Exception exception) { /** * 这里验证单个字段属性 */ if(exception instanceof ConstraintViolationException){ ConstraintViolationException exs = (ConstraintViolationException) exception; Set<ConstraintViolation<?>> violations = exs.getConstraintViolations(); for (ConstraintViolation<?> item : violations) { /**打印验证不通过的信息*/ System.out.println(item.getMessage()); } } /** * 这里验证Bean */ if(exception instanceof MethodArgumentNotValidException) { MethodArgumentNotValidException methodArgumentNotValidException = (MethodArgumentNotValidException) exception; //按需重新封装需要返回的错误信息 //解析原错误信息,封装后返回,此处返回非法的字段名称,原始值,错误信息 for (FieldError error : methodArgumentNotValidException.getBindingResult().getFieldErrors()) { ArgumentInvalidResult invalidArgument = new ArgumentInvalidResult(); invalidArgument.setDefaultMessage(error.getDefaultMessage()); invalidArgument.setField(error.getField()); invalidArgument.setRejectedValue(error.getRejectedValue()); System.out.println("参数异常:"+error.getField()+error.getDefaultMessage()); } }
if(exception instanceof MissingServletRequestParameterException){ //GET请求参数异常处理
//这里可以封装由springmvc自带的
}
return ""; } }
it's ok,你可以达到你的大部分目的了。。。
hibernate validator 官网:
转载于:https://www.cnblogs.com/huzi007/p/9082956.html
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- springboot使用hibernate validator校验
- 使用springBoot的全局异常处理来处理,参数校验、业务的异常
- SpringBoot使用Hibernate Validator校验参数
- springboot使用hibernate validator校验
- SpringBoot 表单校验相关注解使用
- SpringBoot系列之使用自定义注解校验用户是否登录
- Springboot使用@Valid 和AOP做参数校验及日志输出问题
- 使用struts 怎么才能在执行完js校验页面的信息,发现不全的情况下,不让页面提交到Action中
- SpringBoot在Maven环境下如何使用自己项目的parent?
- 使用AJAX完成用户名是否存在异步校验:
- 【SSH网上商城】使用AJAX异步加载校验用户名是否存在
- SpringBoot入门:SpringBoot的数据库操作:spring-data-jpa的使用
- SpringBoot使用WebJars统一管理静态资源的方法
- 【Struts2十】校验表达二:使用xml配置validator来校验表单
- SpringBoot实现短信验证码校验
- 使用SQL-DMO备份数据库并进行校验
- springboot使用thymeleaf出现org.xml.sax.SAXParseException的解决办法
- springboot使用之一:连接生产数据库,添加连接池
- struts2中validation校验框架的原理和使用
- 使用Springboot配置druid