出于对前端传递参数校验是否为空或者是否是空字符串,传统的if()else{}方法过于难受,每次都需要占用大量的代码,很不优雅,因此搜索找到@Validated用法来优化代码。
一、使用步骤
- 导入依赖(springboot 2.3之前的集成在spring-boot-starter-web里了,所以不需要额外引入包;springboot 2.3之后需要引入 spring-boot-starter-validation)
- 在实体类、controller、方法放上注解;
- 全局异常处理器,捕获异常、处理异常、封装返回值;
二、代码示例
maven:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2.3版本之前的不需要加,如果是2.3版本这里会有,我的是2.7.5所以需要单独引入。
实体类:添加@NotNull、@NotEmpty注解。
package com.qiyue.domain.dto;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
@Data
public class MissionInsertDTO {
/**
* 任务标题
*/
@NotNull(message = "任务标题不能为空")
@NotEmpty(message = "任务标题传值为空,重新传值")
private String missionTitle;
/**
* 任务描述
*/
@NotNull(message = "任务描述不能为空")
@NotEmpty(message = "任务描述传值为空,重新传值")
private String missionDesc;
/**
* 任务类型
*/
@NotNull(message = "任务类型不能为空")
private int missionType;
/**
* 任务开启单元
*/
@NotNull(message = "任务开启单元不能为空")
private Integer missionUnit;
/**
* 任务开启课程
*/
@NotNull(message = "任务开启课程不能为空")
private Integer missionLesson;
/**
* 方便对任务的管理
*/
@NotNull(message = "方便对任务的管理不能为空")
private Integer missionStatus;
}
controller+方法
在controller上加
@Validated
在方法的传参加
@Valid
package com.qiyue.controller;
import com.qiyue.domain.dto.MissionInsertDTO;
import com.qiyue.domain.dto.PageDTO;
import com.qiyue.domain.po.Mission;
import com.qiyue.domain.query.PageQuery;
import com.qiyue.result.Result;
import com.qiyue.service.MissionService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.List;
/**
* <p>
* 陪练任务表 前端控制器
* </p>
*
* @author LCJ
* @since 2024-06-29
*/
@Slf4j
@Validated
@RestController
@RequestMapping("/mission")
public class MissionController {
@Autowired
private MissionService missionService;
@PostMapping
public Result insertMission(@RequestBody @Valid MissionInsertDTO missionInsertDTO) {
log.info("missionInsertDTO:{}", missionInsertDTO);
return missionService.insertMission(missionInsertDTO);
}
@GetMapping
public Result<PageDTO<Mission>> queryMissionPage(PageQuery pageQuery) {
log.info("pageQuery:{}", pageQuery);
return missionService.queryMissionPage(pageQuery);
}
}
全局异常处理器,捕获异常、处理异常、封装返回值;
校验如果有问题,会抛出异常DefaultHandlerException
在GlobalExceptionHandler去处理并封装返回就行;
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<Map<String, Object>> handleMethodArgumentNotValidException(MethodArgumentNotValidException ex) {
Map<String, Object> errorMap = new HashMap<>();
errorMap.put("code", 400);
errorMap.put("message", "参数验证错误");
errorMap.put("errors", ex.getBindingResult().getFieldErrors().stream()
.collect(Collectors.toMap(
FieldError::getField,
FieldError::getDefaultMessage
)));
return ResponseEntity.badRequest().body(errorMap);
}
测试
如果是空返回结果