2025-03-19 15:04:57 +08:00

114 lines
3.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 统一验证
本商城使用spring提供的统一校验工具`spring-boot-starter-validation`对请求进行校验
### 导入依赖
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
```
这里通过注解封装了几种常用的校验
- `@NotNull` 不能为null
- `@NotEmpty` 不能为null、空字符串、空集合
- `@NotBlank` 不能为null、空字符串、纯空格的字符串
- `@Min` 数字最小值不能小于x
- `@Max` 数字最大值不能大于x
- `@Email` 字符串为邮件格式
- `@Max` 数字最大值不能大于x
- `@Size` 字符串长度最小为x、集合长度最小为x
- `@Pattern` 正则表达式
我们以`SpuDTO`为例,看看怎么使用
```java
public class SpuDTO{
private static final long serialVersionUID = 1L;
@ApiModelProperty("spuId")
private Long spuId;
@ApiModelProperty("品牌ID")
private Long brandId;
@NotNull(message = "分类不能为空")
@ApiModelProperty("分类ID")
private Long categoryId;
@NotNull(message = "店铺分类不能为空")
@ApiModelProperty("店铺分类ID")
private Long shopCategoryId;
@NotNull(message = "商品名称不能为空")
@ApiModelProperty("spu名称")
private String name;
/** 省略其余字段以及get、set、tostring方法*/
}
```
我们在Controller层使用该bean并使用`@Valid`注解,使校验的注解生效,如`SpuController`
```java
@RestController("platformSpuController")
@RequestMapping("/admin/spu")
@Api(tags = "admin-spu信息")
public class SpuController {
@Autowired
private SpuService spuService;
@PostMapping
@ApiOperation(value = "保存spu信息", notes = "保存spu信息")
public ServerResponseEntity<Void> save(@Valid @RequestBody SpuDTO spuDTO) {
checkSaveOrUpdateInfo(spuDTO);
spuService.save(spuDTO);
return ServerResponseEntity.success();
}
}
```
并且在`DefaultExceptionHandlerConfig` 拦截由`@Valid` 触发的异常信息并返回:
```java
@RestController
@RestControllerAdvice
public class DefaultExceptionHandlerConfig {
@ExceptionHandler({ MethodArgumentNotValidException.class, BindException.class })
public ResponseEntity<ServerResponseEntity<List<String>>> methodArgumentNotValidExceptionHandler(Exception e) {
logger.error("methodArgumentNotValidExceptionHandler", e);
List<FieldError> fieldErrors = null;
if (e instanceof MethodArgumentNotValidException) {
fieldErrors = ((MethodArgumentNotValidException) e).getBindingResult().getFieldErrors();
}
if (e instanceof BindException) {
fieldErrors = ((BindException) e).getBindingResult().getFieldErrors();
}
if (fieldErrors == null) {
return ResponseEntity.status(HttpStatus.OK)
.body(ServerResponseEntity.fail(ResponseEnum.METHOD_ARGUMENT_NOT_VALID));
}
List<String> defaultMessages = new ArrayList<>(fieldErrors.size());
for (FieldError fieldError : fieldErrors) {
defaultMessages.add(fieldError.getField() + ":" + fieldError.getDefaultMessage());
}
return ResponseEntity.status(HttpStatus.OK)
.body(ServerResponseEntity.fail(ResponseEnum.METHOD_ARGUMENT_NOT_VALID, defaultMessages));
}
@ExceptionHandler({ HttpMessageNotReadableException.class })
public ResponseEntity<ServerResponseEntity<List<FieldError>>> methodArgumentNotValidExceptionHandler(
HttpMessageNotReadableException e) {
logger.error("methodArgumentNotValidExceptionHandler", e);
return ResponseEntity.status(HttpStatus.OK)
.body(ServerResponseEntity.fail(ResponseEnum.HTTP_MESSAGE_NOT_READABLE));
}
}
```