引言:
@Validated 是在@Valid 注解基础之上,提供了更丰富的功能, 其中之一就是分组校验. 那么什么是分组校验呢?
相信大家在实际工作中, 一定会遇到这样的场景. request的某个参数, 在新增时不需要前端传, 但是编辑时需要前端传, 其余字段也都是一模一样的, 没办法, 还是得建两个request. 用分组校验就是为了解决这个问题的.
废话不多说, 上代码:
- 定义分组
这里定义了一个app分组, 注意, 该类需要继承Default
import javax.validation.groups.Default;
/**
* @author Lynn
* @date 2022/11/14 10:57
*/
public interface AppGroup extends Default {
}
- request字段上加上AppGroup 分组
这样只有在指定为AppGroup 分组时, 才会去对该字段进行校验
/**
* @author Lynn
* @date 2022/9/20 17:59
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class ProductQueryDetailRequest extends ProductBaseRequest {
/**
* 商品类型
*/
@NotNull(message = "商品类型不能为空")
@EnumValid(message = "商品类型输入错误", enumClass = ProductTypeEnum.class)
private Integer productType;
/**
* app来源
*/
@NotBlank(groups = {AppGroup.class}, message = "app来源不能为空")
@EnumValid(message = "app来源输入错误", enumClass = AppSourceEnum.class)
private String appSource;
}
- Controller层注解使用
@Validated({AppGroup.class}) 指定分组为AppGroup
/**
* 查询商品详情
*
* @param request {@link ProductQueryDetailRequest}
* @return {@link BaseResponse<ProductAppDetailResponse>}
*/
@PostMapping("/detail/query")
public BaseResponse<ProductAppDetailResponse>
queryDetail(@RequestBody @Validated({AppGroup.class}) ProductQueryDetailRequest request) {
super.checkUserValidation(request);
ProductDto dto = EntityConverterUtils.convert(request, ProductDto.class);
return BaseResponse.success(EntityConverterUtils.convert(
this.getServiceImpl(dto.getProductType()).queryAppProductDetail(dto), ProductAppDetailResponse.class));
}
这样在Controller层指定AppGroup分组, 才会对appSource字段进行校验, 不指定分组就不校验该字段.
以此类推, 可以定义不同的分组, 去匹配不通的场景, 就可以减少request的创建.