使用@Validated校驗(yàn)List接口參數(shù)的兩種方式
注: 不僅限于兩種遇汞,此處只列舉了兩種
創(chuàng)建springboot項(xiàng)目, 并添加 spring-boot-starter-validation
jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
定義接口和參數(shù)
@RestController
@RequestMapping(value = "/test")
public class TestController {
@PostMapping(value = "/create")
public String test(@RequestBody List<User> users){
return "success";
}
@lombok.Data
public static class User{
@NotNull(message = "用戶id不能為空")
private Integer userId;
@NotBlank(message = "用戶名字不能為空")
private String username;
@NotNull(message = "薪資不能為空")
private Double salary;
}
}
添加校驗(yàn)
- 直接在參數(shù)列表中添加
@Validated
注解(無效)
public String test(@RequestBody @Validated List<User> users)
如上所示肛真,如果我們直接在參數(shù)列表中添加校驗(yàn)注解传货,如果是User
對象參數(shù)是能夠校驗(yàn)到參數(shù)的,如果是List<User>
參數(shù)校驗(yàn)就無效了锰镀,該注解只能校驗(yàn)JavaBean超棺。
- 使用
@Validated
和@Valid
注解(有效)
在Controller類上加上@Validated, 在需要校驗(yàn)的參數(shù)上加上 @Valid, 就可以校驗(yàn)list里的實(shí)體類的屬性奕巍。
@Validated
@RestController
@RequestMapping(value = "/test")
public class TestController {
@PostMapping(value = "/create")
public String test(@RequestBody @Valid List<User> users){
return "success";
}
}
@Validated
和@Valid
注解的區(qū)別:
在Controller中校驗(yàn)方法參數(shù)時,使用@Valid和@Validated并無特殊差異(若不需要分組校驗(yàn)的話)驶冒。
@Valid:標(biāo)準(zhǔn)JSR-303規(guī)范的標(biāo)記型注解苟翻,用來標(biāo)記驗(yàn)證屬性和方法返回值,進(jìn)行級聯(lián)和遞歸校驗(yàn)骗污。
@Validated:Spring的注解崇猫,是標(biāo)準(zhǔn)JSR-303的一個變種(補(bǔ)充),提供了一個分組功能需忿,可以在入?yún)Ⅱ?yàn)證時诅炉,根據(jù)不同的分組采用不同的驗(yàn)證機(jī)制。
方法級別:
@Validated注解可以用于類級別屋厘,用于支持Spring進(jìn)行方法級別的參數(shù)校驗(yàn)涕烧。
@Valid可以用在屬性級別約束,用來表示級聯(lián)校驗(yàn)汗洒。
@Validated只能用在類议纯、方法和參數(shù)上,而@Valid可用于方法溢谤、字段瞻凤、構(gòu)造器和參數(shù)上憨攒。
- 自定義實(shí)現(xiàn)一個List
ValidatedList
, 加@Validated
注解(有效)
@RestController
@RequestMapping(value = "/test")
public class TestController {
@PostMapping(value = "/create")
public String test(@RequestBody @Validated ValidatedList<User> users){
return "success";
}
}
@lombok.Data
public class ValidatedList<E> implements List<E> , Serializable {
@Valid
private List<E> list = new LinkedList<>();
@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);
}
}