使用@Vaild注解可以简化入参的校验,配合统一异常实现简单快捷的入参校验,具体使用参照以下
如果你是springboot项目,此依赖内已经引入,无需再次引入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.0.5.RELEASE</version>
</dependency>
如果没有,将依赖jar包引入到自己的项目中,maven依赖如下
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.3.5.Final</version>
</dependency>
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotBlank;
import org.hibernate.validator.constraints.Range;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserReq implements Serializable {
private Integer id;
@NotBlank(message = "用户名不能为空")
@Length(message = "用户名最大为{max}个字符", max = 20)
private String username;
@NotBlank(message = "密码不能为空")
@Length(message = "密码长度限制为{min}-{max}", min = 8, max = 16)
private String password;
@NotNull(message = "性别不能为空")
private Byte sex;
@Range(message = "年龄范围为{min}-{max}", min = 0, max = 120)
private Integer age;
}
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
@Slf4j
@RestController
@RequestMapping("/user/post")
public class PostController {
@PostMapping("/create")
public String createUser(@Valid @RequestBody UserReq req){
log.info(JSON.toJSONString(req));
return "成功";
}
}
虽然拦截成功,但错误出参不知道所以然,一头雾水,需进行优化
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
@Slf4j
@RestController
@RequestMapping("/user/post")
public class PostController {
@PostMapping("/create")
public String createUser(@Valid @RequestBody UserReq req, BindingResult result){
// 如果发生错误,则返回第一个错误信息,这里也可以自定义返回信息
if(result.hasErrors()){
String message = result.getAllErrors().get(0).getDefaultMessage();
log.error(message);
return message;
}
log.info(JSON.toJSONString(req));
return "成功";
}
}
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
@Slf4j
@ControllerAdvice
public class MyExceptionHandler {
@ResponseBody
@ExceptionHandler(Exception.class)
public ResultData exceptionHandler(Exception exception){
log.error("统一异常", exception);
// 捕获对应异常进行处理,默认返回第一个错误信息,这里也可以自定义返回信息
if(exception instanceof MethodArgumentNotValidException){
MethodArgumentNotValidException ex = (MethodArgumentNotValidException) exception;
String message = ex.getBindingResult().getAllErrors().get(0).getDefaultMessage();
return ResultData.getFailResult(message);
}
return ResultData.getFailResult("服务器繁忙,请稍后再试!");
}
}
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
@Slf4j
@RestController
@RequestMapping("/user/post")
public class PostController {
@PostMapping("/create")
public String createUser(@Valid @RequestBody UserReq req){
log.info(JSON.toJSONString(req));
return "成功";
}
}
原文:https://www.cnblogs.com/banmoon/p/14150452.html