@Validated验证List集合

在开发时发现,@Validated只能验证单个实体类,在验证List集合时则不生效

@PostMapping(value="/test")
public ApiResult getRepaymentPlan(@RequestBody @Validated List<Test> repaymentPlanVOs){

}

经过查资料得知,@valid是可以使用的,我们自定义一个ValidList类来替换List就可以达到验证的目的,话不多说,直接看代码

public class ValidList<E> implements List<E> {

  @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);
  }

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

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

然后用ValidList类替换我们的List即可

@PostMapping(value="/test")
public ApiResult getRepaymentPlan(@RequestBody @Validated ValidList<Test> repaymentPlanVOs){

}

补充,将@Validated返回的异常替换为我们自定义的json格式并返回,只需在当前controller类里注入一个异常bean,并用@ExceptionHandler来捕获对应的异常即可。MethodArgumentNotValidException为@Validated返回的异常,这里只需要捕获对应异常即可

@ExceptionHandler(value = MethodArgumentNotValidException.class)
	@ResponseBody
	public Map<String,Object> allExceptionHandler(MethodArgumentNotValidException e){
        Map<String,Object> result = new HashMap<String,Object>();
		MethodArgumentNotValidException ex = (MethodArgumentNotValidException)e;
		BindingResult bindingResult = ex.getBindingResult();
		StringBuilder errMsg = new StringBuilder(bindingResult.getFieldErrors().size() * 16);
		errMsg.append("Invalid request:");
		for (int i = 0 ; i < bindingResult.getFieldErrors().size() ; i++) {
			if(i > 0) {
				errMsg.append(",");
			}
			FieldError error = bindingResult.getFieldErrors().get(i);
			errMsg.append(error.getField()+":"+error.getDefaultMessage());
		}
        result.put("res_code","400");
        result.put("res_mess",errMsg.toString());
		return result;
	}

 

  • 10
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
引用\[1\]中提到了使用@Validated注解来对Controller中的参数进行校验,但是发现未生效。要使@Validated集合生效,可以使用@Valid注解来标注集合参数。例如,如果你的Controller方法接收一个List作为参数,你可以在该参数前加上@Valid注解,以启用集合参数的校验功能。这样,在校验时会对集合中的每个元素进行校验。需要注意的是,集合中的元素需要定义相应的校验规则。引用\[1\]中提到的核心依赖javax.validation和org.hibernate.validator可以用于定义校验规则。同时,还需要在spring的配置文件中配置<mvc:annotation-driven />来启用校验功能。这样,@Validated注解和@Valid注解就可以对集合参数进行校验了。 #### 引用[.reference_title] - *1* *3* [springmvc @Validated 使用不生效问题](https://blog.csdn.net/weixin_38185589/article/details/108070429)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [@Validated注解不生效问题汇总大全](https://blog.csdn.net/qiuxuezhe_fei/article/details/128197714)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值