您的位置:首页 > 编程语言 > Java开发

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 官网:

 http://docs.jboss.org/hibernate/validator/4.2/reference/zh-CN/html_single/#validator-usingvalidator-annotate

 

转载于:https://www.cnblogs.com/huzi007/p/9082956.html

  • 点赞
  • 收藏
  • 分享
  • 文章举报
a304096740 发布了0 篇原创文章 · 获赞 0 · 访问量 2299 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: