为List<T>中的T进行参数校验

1、现在前端发送了一个POST请求,他的Data是一个数组,而不是对象(jsonObj的值两侧是中括号)。

var jsonObj = [{'id':11, 'name':'叵'}, {'id':12, 'name':'卜'}];
$.ajax({
    type : "post",
    // 省略
    data : JSON.stringify(jsonObj),
    // 省略
});

 

2、后端的请求方法应该让一个Input的数组对象,或是Input泛型的List对象入参,来进行数据绑定

@RequestMapping
@ResponseBody
public Integer diningId(@RequestBody PersonInput[] inputs) {
    // 省略
    return 0;
}

 

@RequestMapping
@ResponseBody
public Integer diningId(@RequestBody List<PersonInput> inputs) {
    // 省略
    return 0;
}

 

就参数绑定而言,两者都是可行的,参数成功绑定了。

 

3、现在需要做参数校验,比如id不能为空白,

很容易想到在PersonInput.id域的上方追加@NotBlank主键,

在请求方法中追加一个BindingResult对象作为入参。

@RequestMapping
@ResponseBody
public Integer diningId(@RequestBody List<PersonInput> inputs, BindingResult checker) {
    // 省略
    return 0;
}

 

class PersonInput {

    @NotBlank
    private String id;

    private String name;

    // 省略

}

 

4、这样做的话,参数绑定依然能够成功,但是参数校验会失败,checker会是null

 

5、需要追加定义一个新的Pojo,只持有List<PersonInput>对象,并在通过@Valid递归校验。

 

class PersonInputList {

    @Valid
    private List<PersonInput> inputs;

    // 省略

}

转载于:https://www.cnblogs.com/deolin/p/7416398.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码使用了BeanCopier来实现对象之间的属性拷贝,其copyList方法接收两个参数,sources为源对象,clazz为目标对象的类型,返回值为经过属性拷贝后的目标对象列表。 这里可能存在的问题是,源对象的类型和目标对象的类型并没有做完整的类型校验,有可能会在运行时出现类型转换异常。同时,在使用完BeanCopier后,没有释放对BeanCopier的引用,可能会引起内存泄漏。 可以对代码进行如下修改: ```java public static <T, M> List<T> copyList(List<M> sources, Class<T> clazz) { if (Objects.isNull(sources) || Objects.isNull(clazz)) { throw new IllegalArgumentException(); } List<T> targets = new ArrayList<>(sources.size()); BeanCopier copier = BeanCopier.create(sources.get(0).getClass(), clazz, false); for (M source : sources) { T target; try { target = clazz.newInstance(); } catch (InstantiationException | IllegalAccessException e) { throw new RuntimeException(e); } copier.copy(source, target, null); targets.add(target); } return targets; } ``` 修改后的代码,将sources参数类型修改为List类型,这样就可以通过List的泛型来避免类型转换异常。同时使用了for循环来遍历源对象列表,避免了使用stream时可能存在的空指针异常。还为目标对象列表指定了初始容量,避免了频繁扩容带来的性能问题。在使用完BeanCopier后,还将其置为null,避免了内存泄漏的问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值