@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