问题描述
我们在进行前后端数据交互的时候,总要进行数据非空校验以及其他的一些相关的操作,我们可以用
javax.validation.Validation包下的注解进行验证,实现简单
给大家看一下我刚工作时候写的参数校验OvO
public String studentLeaveView(@RequestHeader("schoolId") String schoolId, String leaveId, Integer type, String taskId) {
Map<String, Object> map = new HashMap<>();
if (StringUtils.isEmpty(schoolId)) {
return ApiResponseBase.result(ApiResponseCode.SCHOOL_ID_IS_NULL, "学校id为空");
} else if (StringUtils.isEmpty(leaveId)) {
return ApiResponseBase.result(ApiResponseCode.LEAVE_ID_IS_NULL, "假条id为空");
} else if (StringUtils.isNull(type)) {
return ApiResponseBase.result(ApiResponseCode.LEAVE_TYPE_IS_NULL, "请假类型为空");
}
//业务处理
}
这个接口只有三个参数需要检验,所以现在看起来不是特别繁琐,但是如果参数多呢,试想一下是不是惨不忍睹。。。。
利用javax.validation解决
- 编写实体类
package com.komlin.project.api.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotNull;
/**
* @Auther: mt
* @Date: 2020/08/03 11:00
* @Contact: 1692314230@qq.com
* @Description: 请求参数类封装
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class TestDTO {
//非空注解
@NotNull(message = "param1 is not null")
private String param1;
@NotNull(message = "param2 is not null")
private String param2;
}
- 进行校验
package com.komlin.project.api.controller;
import com.komlin.common.enums.ResponseEnum;
import com.komlin.common.pojo.ResponseEntity;
import com.komlin.common.utils.ValidationUtils;
import com.komlin.project.api.dto.TestDTO;
import com.komlin.project.api.vo.TestVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
import static com.komlin.common.constant.HttpMethodConstant.POST;
/**
* @Auther: mt
* @Date: 2020/08/03 11:00
* @Contact: 1692314230@qq.com
* @Description: Demo
*/
@Api(tags = "参考模板")
@RestController
@Slf4j
@RequestMapping("api/test")
public class ApiExampleController {
@PostMapping("/")
@ApiOperation(value = "post测试",httpMethod = POST)
public ResponseEntity<TestVO> postTest(@RequestBody @Valid TestDTO test, BindingResult bindingResult){
//校验参数
if (bindingResult.hasErrors()) {
return ValidationUtils.validate(bindingResult);
}
//正确返回
// return ResponseEntity.ok();
// return ResponseEntity.ok(new TestVO());
//错误返回
return ResponseEntity.error(ResponseEnum.SERVER_EXCEPTION);
}
}
ValidationUtils
package com.komlin.common.utils;
import com.gexin.fastjson.JSON;
import com.gexin.fastjson.JSONObject;
import com.komlin.common.pojo.ErrorResult;
import com.komlin.common.pojo.ResponseBase;
import com.komlin.common.pojo.ResponseEntity;
import com.komlin.project.common.response.ApiResponseBase;
import org.springframework.validation.BindingResult;
import java.util.ArrayList;
import java.util.List;
/**
* @Auther: mt
* @Date: 2020-08-01 12:23
* @Description: 信息校验
*/
public class ValidationUtils {
/**
* 校验请求参数
*
* @param bindingResult
* @return
*/
public static ResponseBase validateParams(BindingResult bindingResult) {
List<ErrorResult> errorResultList = new ArrayList<>();
if (bindingResult.hasErrors()) {
bindingResult.getFieldErrors().forEach(fieldError -> {
errorResultList.add(ErrorResult.builder()
.param(fieldError.getField())
.message(fieldError.getDefaultMessage())
.build());
});
}
return ResponseBase.paramError("Incorrect request parameter", errorResultList);
}
/**
* 校验请求参数
*
* @param bindingResult
* @return
*/
public static ResponseEntity validate(BindingResult bindingResult) {
List<ErrorResult> errorResultList = new ArrayList<>();
if (bindingResult.hasErrors()) {
bindingResult.getFieldErrors().forEach(fieldError -> {
errorResultList.add(ErrorResult.builder()
.param(fieldError.getField())
.message(fieldError.getDefaultMessage())
.build());
});
}
return new ResponseEntity(400, JSON.toJSONString(errorResultList), null);
}
/**
* 校验请求参数
* @param bindingResult
* @return
*/
public static String validateParam(BindingResult bindingResult) {
List<ErrorResult> errorResults = new ArrayList<>();
if (bindingResult.hasErrors()) {
bindingResult.getFieldErrors().forEach(fieldError -> {
errorResults.add(ErrorResult.builder()
.param(fieldError.getField())
.message(fieldError.getDefaultMessage())
.build());
});
}
return ApiResponseBase.result(3000,JSONObject.toJSONString(errorResults.get(0).getMessage()));
}
}
附录:注解说明
注解 | 支持的数据类型 | 作用 |
---|---|---|
@AssertFalse | Boolean,boolean | 值等于false |
@AssertTrue | Boolean,boolean | 值等于true |
@Future | java.util.Date等 | 检查给定的日期比当前日期晚 |
@Past | java.util.Date等 | 检查给定的日期比当前日期早 |
@Max | BigDecimal, BigInteger, byte, short, int, long 以及包装类 | 检查该值是否小于或等于约束条件中指定的最大值. |
@Min | BigDecimal, BigInteger, byte, short, int, long 以及包装类 | 检查该值是否大于或等于约束条件中指定的最小值. |
@NotNull | 任意类型 | 带注释的值不为null. |
@Null | 任意类型 | 带注释的值为null. |
@Pattern(regex=, flag=) | String | 检查该字符串是否能够在match指定的情况下被regex定义的正则表达式匹配. |
@Size(min=, max=) | String,Collection,Map,array | 检查带注释的元素的大小是否在最小值和最大值之间. |