當前端表單傳過來較多數(shù)據(jù)時,我們后端可以采用JSR303校驗校驗,避免使用大量的if else來校驗
一、使用說明
1.導入依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2.將前端傳過來的表單數(shù)據(jù)用一個dto對象接收,并且在對象需要做校驗屬性上加上@NotEmpty、@Size注解等
@Data
@ApiModel(value="AddCourseDto", description="新增課程基本信息")
public class AddCourseDto {
//@NotEmpty(message = "課程名稱不能為空")
@NotEmpty(groups = ValidationGroups.Inster.class,message = "新增課程名稱不能為空")
@NotEmpty(groups = ValidationGroups.Update.class,message = "修改課程名稱不能為空")
@ApiModelProperty(value = "課程名稱", required = true)
private String name;
@NotEmpty(message = "適用人群不能為空")
@ApiModelProperty(value = "適用人群", required = true)
private String users;
@ApiModelProperty(value = "課程標簽")
private String tags;
@NotEmpty(message = "課程分類不能為空")
@ApiModelProperty(value = "大分類", required = true)
private String mt;
@NotEmpty(message = "課程分類不能為空")
@ApiModelProperty(value = "小分類", required = true)
private String st;
@NotEmpty(message = "課程等級不能為空")
@ApiModelProperty(value = "課程等級", required = true)
private String grade;
@ApiModelProperty(value = "教學模式(普通浆劲,錄播割按,直播等)", required = true)
private String teachmode;
@ApiModelProperty(value = "課程介紹")
@Size(message = "課程介紹內(nèi)容太少",min = 10)
private String description;
3.在controller方法參數(shù)上開啟校驗,也就是加上@Validated注解
@ApiOperation("課程新增接口")
@PostMapping("/course")
public CourseBaseInfoVo createCourseBase(@RequestBody @Validated({ValidationGroups.Inster.class}) AddCourseDto addCourseDto){
//機構(gòu)id丈氓,由于認證系統(tǒng)沒有上線暫時硬編碼
Long companyId = 1232141425L;
return courseBaseService.createCourseBase(companyId,addCourseDto);
}
4.我們還需要自定義異常來將這些錯誤信息返回給前端(如果某個屬性為空,就會報MethodArgumentNotValidException錯誤)
/**
*todo 因為我們使用了JSR303來進行表單數(shù)據(jù)校驗蓖墅,所以要定義這個異常,來返回對應的錯誤信息
* @param e
* @return
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public RestErrorResponse MethodArgumentNotValidException(MethodArgumentNotValidException e){
BindingResult bindingResult = e.getBindingResult();
//拿到這些錯誤信息
List<String> list = new ArrayList<>();
bindingResult.getFieldErrors()
.stream()
.forEach(
item -> list.add(item.getDefaultMessage())
);
//將集合里面的錯誤信息拼接起來
String msg = StringUtils.join(list, ",");
log.error("【系統(tǒng)異沉认】{}",msg);
return new RestErrorResponse(msg);
}
5.當這個dto類被多個接口用來接收參數(shù)使用時膘掰,我們可以設(shè)置組
①創(chuàng)建一個類窒舟,添加各種組(接口)
/**
* @description 校驗分組
* @author Mr.Su
* @date
* @version 1.0
*/
public class ValidationGroups {
public interface Inster{};
public interface Update{};
public interface Delete{};
}
②在屬性上設(shè)置不同組對應不同信息
//@NotEmpty(message = "課程名稱不能為空")
@NotEmpty(groups = ValidationGroups.Inster.class,message = "新增課程名稱不能為空")
@NotEmpty(groups = ValidationGroups.Update.class,message = "修改課程名稱不能為空")
@ApiModelProperty(value = "課程名稱", required = true)
private String name;
③在不同接口上定義對應的組(比如新增我就定義組為insert,修改就定義組為update)
@RequestBody @Validated({ValidationGroups.Inster.class}) AddCourseDto addCourseDto
6.相關(guān)注解