要实现注解对参数的验证,需要先创建一个模型类 ,然后在控制器中获取参数并进行验证,具体步骤如下,
先要创建spring的工程,这部分先不讲了
现在pom.xml 中加入如下依赖:
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.3.4.Final</version>
</dependency>
建表语句如下:
CREATE TABLE `t_user` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`user_name` varchar(255) DEFAULT NULL,
`sex` tinyint(1) DEFAULT '1',
`note` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4;
1、首先进行参数验证
package com.example.demo4.entity;
import org.hibernate.validator.constraints.NotBlank;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
@Valid
public class TUser {
private Integer id;
@NotBlank(message = "请输入用户名")
@NotNull(message = "用户名不能为空")
private String userName;
@NotNull(message = "性别不能为空")
private Integer sex;
@NotNull(message = "备注不能为空")
private String note;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
public String getNote() {
return note;
}
public void setNote(String note) {
this.note = note;
}
}
2、控制器的编写
package com.example.demo4.controller;
import com.alibaba.fastjson.JSONObject;
import com.example.demo4.Tools.OkHttpRequest;
import com.example.demo4.entity.TUser;
import com.example.demo4.service.TUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.io.IOException;
@RestController
@RequestMapping("/tuser")
public class TUserController {
@Autowired
TUserService tUserService;
@PostMapping("/converter")
public TUser getuser(@RequestBody @Valid TUser user) {
return user;
}
}
完成上述验证,会在控制台抛出异常,为了实现全局捕获异常,需要加入下面的代码
1、首先定义一个枚举类
package com.example.demo4.handler;
public interface BaseErrorInfoInterface {
int getResultCode();
String getResultMessage();
}
1、先定义一个枚举类
package com.example.demo4.enumion;
import com.example.demo4.handler.BaseErrorInfoInterface;
public enum CommonEnum implements BaseErrorInfoInterface {
SUCCESS(200, "成功"),
BODY_NOT_MATCH(400, "请求的数据格式不符"),
SIGNAUTION_NOT_MATCH(401, "请求的数据签名不符"),
NOT_FOUND(404, "未找到资源"),
INTERNAL_SERVER_ERROR(500, "服务器内部错误"),
SERVER_BUSY(503, "服务器忙,请稍后重试。。。")
;
private int resultCode;
private String resultMsg;
CommonEnum(int resultCode, String resultMsg) {
this.resultCode = resultCode;
this.resultMsg = resultMsg;
}
@Override
public int getResultCode() {
return this.resultCode;
}
@Override
public String getResultMessage() {
return this.resultMsg;
}
}
2、然后定义一个JsonResult 类,实现返回参数
package com.example.demo4.handler;
import com.alibaba.fastjson.JSONObject;
import com.example.demo4.enumion.CommonEnum;
class JsonResult {
/**
* 响应代码
*/
private int code;
/**
* 响应消息
*/
private String message;
/**
* 响应结果
*/
private Object result;
public JsonResult() {
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Object getResult() {
return result;
}
public void setResult(Object result) {
this.result = result;
}
/**
* 成功
*
* @return
*/
public static JsonResult success() {
return success(null);
}
/**
* 成功
* @param data
* @return
*/
public static JsonResult success(Object data) {
JsonResult rb = new JsonResult();
rb.setCode(CommonEnum.SUCCESS.getResultCode());
rb.setMessage(CommonEnum.SUCCESS.getResultMessage());
rb.setResult(data);
return rb;
}
/**
* 失败
*/
public static JsonResult error(int code, String message) {
JsonResult rb = new JsonResult();
rb.setCode(code);
rb.setMessage(message);
rb.setResult(null);
return rb;
}
/**
* 失败
*/
public static JsonResult error( String message) {
JsonResult rb = new JsonResult();
rb.setCode(-1);
rb.setMessage(message);
rb.setResult(null);
return rb;
}
@Override
public String toString() {
return JSONObject.toJSONString(this);
}
}
3、定义个全局异常捕获类
package com.example.demo4.handler;
import com.example.demo4.enumion.CommonEnum;
import org.springframework.context.support.DefaultMessageSourceResolvable;
import org.springframework.validation.BindException;
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;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.util.stream.Collectors;
/**
* validate校验 异常统一捕捉处理类
*/
@ControllerAdvice
public class GlobalExceptionHandler {
/**
* 处理请求参数格式错误 @RequestBody上validate失败后抛出的异常是MethodArgumentNotValidException异常
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public JsonResult MethodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
String message = e.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining());
//下边ResultCodeEnum.PARAMS_BS_ERROR.getCode()就是你自己自定义的返回code码
return JsonResult.error(CommonEnum.SIGNAUTION_NOT_MATCH.getResultCode(),message);
}
/**
* 处理Get请求中 使用@Valid 验证路径中请求实体校验失败后抛出的异常
*/
@ExceptionHandler(BindException.class)
@ResponseBody
public JsonResult BindExceptionHandler(BindException e) {
String message = e.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining());
return JsonResult.error(CommonEnum.SIGNAUTION_NOT_MATCH.getResultCode(),message);
}
/**
* 处理请求参数格式错误 @RequestParam上validate失败后抛出的异常是ConstraintViolationException
*/
@ExceptionHandler(ConstraintViolationException.class)
@ResponseBody
public JsonResult ConstraintViolationExceptionHandler(ConstraintViolationException e) {
String message = e.getConstraintViolations().stream().map(ConstraintViolation::getMessage).collect(Collectors.joining());
return JsonResult.error(CommonEnum.SIGNAUTION_NOT_MATCH.getResultCode(),message);
}
}
4、用postman测试
http://127.0.0.1:8080/tuser/converter
{
"userName" : "111",
"sex" :null,
"note" : null
}
#返回值如下
{
"code": 401,
"message": "性别不能为空备注不能为空",
"result": null
}