@Validated注解分组的使用

引言:
@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的创建.

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值