我是靠谱客的博主 贪玩星月,最近开发中收集的这篇文章主要介绍SpringBoot @Valid请求参数校验,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

代码案例

    @ApiOperation(value = "测试表编辑/保存")
    @PostMapping
    public ResultVo<Boolean> saveOrUpdate(@Valid @RequestBody TemplateTableDTO templateTable) {
        return new ResultVo<>(templateTableAppService.saveOrUpdate(templateTable));
    }
/**
 * <p>
 * 测试表-20221101
 * </p>
 *
 * @author smallNorth_Lee
 * @date 2022/11/01
 */
@Data
@ApiModel(value = "DevelopTemplateTable对象", description = "测试表-20221101")
public class TemplateTableDTO implements Serializable {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "主键")
    private Long id;

    @NotBlank(message = "命名空间不能为空")
    @Size(min = 1, max = 20, message = "命名空间不能超过20个字符")
    @ApiModelProperty(value = "命名空间")
    private String namespace;

    @NotBlank(message = "服务名称不能为空")
    @ApiModelProperty(value = "服务名称")
    private String serviceName;
}
注解参考:

@NotEmpty:作用在String、collection、map、数组上,不能为null,size > 0

@NotBlank: 只能用于String,不能为null,也不可以是" ",即trim()后长度大于0

@NotNull:作用于任何类型,不能为null,可以为空

@AssertTrue:必须为true

@AssertFalse:必须为false

@Min(value):必须为一个数字,且值大于等于指定的值

@Max(value):必须为一个数字,且值小于等于指定的值

@Size(max,min):限制参数大小范围

@Future:必须是一个将来的日期

@Past:必须是一个过去的日期

@Pattern(value):指定正则

统一异常拦截处理

这里两种异常,是因为@Valid和@Validated的注解抛出的异常不一样的,按需添加
/**
 * 校验字段异常拦截
 *
 * @author smallNorth_Lee
 * @date 2022/11/18
 */
@RestControllerAdvice(annotations = {RestController.class})
@Slf4j
public class ValidatedExceptionHandler {

	/**
	 *
	 *使用@Valid异常
	 **/
    @ExceptionHandler(BindException.class)
    public ResultVo handleBindException(BindException ex) {
        FieldError fieldError = ex.getBindingResult().getFieldError();
        return new ResultVo<>(fieldError.getDefaultMessage());
    }

/**
	 *
	 *使用@Validated异常
	 **/
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResultVo handleMethodArgumentNotValidException(MethodArgumentNotValidException ex) {
        FieldError fieldError = ex.getBindingResult().getFieldError();
        return new ResultVo<>(fieldError.getDefaultMessage());
    }
}

hold on !!! 如果参数为List,这种方式就失效了,解决办法如下

/**
 * List<T>集合校验
 *
 * @author smallNorth_Lee
 * @date 2022/11/18
 */
public class ValidList<E> implements List<E> {

    @Valid
    private List<E> list = new ArrayList<>();

    public List<E> getList() {
        return list;
    }

    public void setList(List<E> list) {
        this.list = list;
    }

    @Override
    public int size() {
        return list.size();
    }

    @Override
    public boolean isEmpty() {
        return list.isEmpty();
    }

    @Override
    public boolean contains(Object o) {
        return list.contains(o);
    }

    @Override
    public Iterator<E> iterator() {
        return list.iterator();
    }

    @Override
    public Object[] toArray() {
        return list.toArray();
    }

    @Override
    public <T> T[] toArray(T[] a) {
        return list.toArray(a);
    }

    @Override
    public boolean add(E e) {
        return list.add(e);
    }

    @Override
    public boolean remove(Object o) {
        return list.remove(o);
    }

    @Override
    public boolean containsAll(Collection<?> c) {
        return list.contains(c);
    }

    @Override
    public boolean addAll(Collection<? extends E> c) {
        return list.addAll(c);
    }

    @Override
    public boolean addAll(int index, Collection<? extends E> c) {
        return list.addAll(index, c);
    }

    @Override
    public boolean removeAll(Collection<?> c) {
        return list.removeAll(c);
    }

    @Override
    public boolean retainAll(Collection<?> c) {
        return list.retainAll(c);
    }

    @Override
    public void clear() {
        list.clear();
    }

    @Override
    public E get(int index) {
        return list.get(index);
    }

    @Override
    public E set(int index, E element) {
        return list.set(index, element);
    }

    @Override
    public void add(int index, E element) {
        list.add(index, element);
    }

    @Override
    public E remove(int index) {
        return list.remove(index);
    }

    @Override
    public int indexOf(Object o) {
        return list.indexOf(o);
    }

    @Override
    public int lastIndexOf(Object o) {
        return list.lastIndexOf(o);
    }

    @Override
    public ListIterator<E> listIterator() {
        return list.listIterator();
    }

    @Override
    public ListIterator<E> listIterator(int index) {
        return list.listIterator(index);
    }

    @Override
    public List<E> subList(int fromIndex, int toIndex) {
        return list.subList(fromIndex, toIndex);
    }

代码案例如下(参数为List时)

    @ApiOperation(value = "测试表编辑/保存,参数为List<T>校验")
    @PostMapping("/insertBatch")
    public ResultVo<Boolean> saveOrUpdateList(@Valid @RequestBody ValidList<TemplateTableDTO> templateTables) {
        return new ResultVo<>();
    }

最后

以上就是贪玩星月为你收集整理的SpringBoot @Valid请求参数校验的全部内容,希望文章能够帮你解决SpringBoot @Valid请求参数校验所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(27)

评论列表共有 0 条评论

立即
投稿
返回
顶部