@Validated注解對單個實體類與List集合的驗證


@Validated注解對單個實體類與List集合的驗證

@Validated對單個實體類的驗證

在實體類上屬性上添加對應的注解

@Data
public class NonServiceOrderDTO {
    @NotBlank(message="工單編號不能為空")
    private String workCode;

    @NotBlank(message="設備SN號不能為空")
    private String intrserial;

    @NotBlank(message="物料編碼不能為空")
    private String itemId;
}

屬性那個注解的含義再文末有說明。

Controller中開啟驗證

在Controller類的方法參數上,添加@Validated注解,開啟驗證。

@PostMapping("/nonserviceorder")
public Result<Map<String, Object>> noServiceWorkOrder(@RequestBody @Validated NonServiceOrderDTO nonServiceOrderDTO) {

    nonServiceOrderService.insertNonOrder(nonServiceOrderDTO);

    return new Result<>();
}

自定義異常處理器,捕獲錯誤信息

當驗證不通過時會拋異常出來,在全局異常中定義異常處理器。捕獲異常信息(因為驗證不通過的項可能有多個,所以統一捕獲處理),拋給前端。

/**
 * 異常處理器
 */
@RestControllerAdvice
public class RenExceptionHandler {
    /**
    * 功能描述: @Validated 校驗失敗時的異常,將校驗結果以json格式返回
     * @author wangwren
    */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Result hanleMethodArgumentNotValidException(MethodArgumentNotValidException ex){
        BindingResult bindingResult = ex.getBindingResult();
        StringBuilder sb = new StringBuilder();
        List<FieldError> fieldErrors = bindingResult.getFieldErrors();
        for (FieldError fieldError : fieldErrors){
            sb.append(fieldError.getDefaultMessage()).append(",");
        }
        sb.deleteCharAt(sb.lastIndexOf(","));
        return new Result().error(500,sb.toString());
    }
}

定義一個全局異常處理器,需要加上@RestControllerAdvice注解,上述方法中的Result類是一個通用響應數據。

@Validated對List集合的驗證
今天開發時發現,@Validated只能驗證單個實體類,對List集合則不生效,於是上網搜索,把問題解決了,這里就記錄一下。

@PostMapping("/assemblageinfo")
public Result<Map<String,Object>> assemblageInfo(@RequestBody @Validated List<AssemblageInfoEntity> assemblageInfoEntities){

    assemblageInfoService.insertOrUpdateAssemblage(assemblageInfoEntities);
    return new Result<>();
}

這段代碼,參數中是List集合,在做參數校驗時,並不生效。查網上資料得知,@Valid可以解決這個問題。需要我們自己定義個ValidList類來替換List,就可以達到目的,直接看代碼吧。

package io.renren.utils;

import lombok.Data;

import javax.validation.Valid;
import java.util.*;

/**
 * 文件描述: 校驗List中字段屬性
 *
 * @author wangwren
 * @date 2020年03月16日 11:22
 */
@Data
public class ValidList<E> implements List<E> {

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

    @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.containsAll(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,該類實現List的方法,方法中還都是List的實現,只是在類中new 的list上加了@Valid注解就可以了。

剩下的就是將方法中參數List改為自己定義的ValidList就可以實現驗證了。

@PostMapping("/assemblageinfo")
public Result<Map<String,Object>> assemblageInfo(@RequestBody @Validated ValidList<AssemblageInfoEntity> assemblageInfoEntities){

    assemblageInfoService.insertOrUpdateAssemblage(assemblageInfoEntities);
    return new Result<>();
}

其他的與驗證單個實體類的操作一樣。

@Valid嵌套校驗

上述案例就是一個嵌套校驗,在一待校驗的pojo類中,包含了待驗證的對象,需要在待驗證的對象上注解@Valid,才能驗證待驗證對象中的成員屬性,這里不能使用@Validated

@Valid與@Validated注解位置上的區別

  • @Valid:用在方法、構造函數、方法參數和成員屬性(field)上。
  • @Validated:用在類型、方法和方法參數上。但不能用在成員屬性上,用在成員屬性上會報錯。

其他注解的含義

 

 

參考

https://blog.csdn.net/u012693530/article/details/80831408

https://blog.csdn.net/qq_27298687/article/details/104423409

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM