此文章发布于39
个月前,部分信息可能已经过时
,请自行斟酌确认。
问题描述
请求参数使用 List<T>
类型时,T 类型中定义的参数校验规则不生效。
参数类
data class ReqParam(
@field:NotBlank(message = "姓名不能为空")
val name: String?
)
控制器
@RequestMapping("valid")
fun valid(@Valid @RequestBody param: List<ReqParam>): R {
return R.success("ok")
}
解决方案1
新定义一个包装类,如:ReqParamList
此方案需要每个接口都要单独写一个类,比较繁琐。
data class ReqParamList(
@field:NotNull
@field:Valid
var list: List<ReqParam>?
)
解决方案2(推荐)
封装 ListParam 类
/**
* List<T> 参数校验工具类,用于校验 List<T> 类型的请求参数
*
* @author xinggang
* @create 2021-12-20
*/
class ListParam<E> : List<E> {
@Valid
private var list = ArrayList<E>()
override val size: Int
get() = list.size
override fun isEmpty(): Boolean {
return list.isEmpty()
}
override fun contains(element: E): Boolean {
return list.contains(element)
}
override fun iterator(): MutableIterator<E> {
return list.iterator()
}
fun add(e: E): Boolean {
return list.add(e)
}
override fun containsAll(elements: Collection<E>): Boolean {
return list.containsAll(elements)
}
override fun get(index: Int): E {
return list[index]
}
override fun indexOf(element: E): Int {
return list.indexOf(element)
}
override fun lastIndexOf(element: E): Int {
return list.lastIndexOf(element)
}
override fun listIterator(): ListIterator<E> {
return list.listIterator()
}
override fun listIterator(index: Int): ListIterator<E> {
return list.listIterator(index)
}
override fun subList(fromIndex: Int, toIndex: Int): List<E> {
return list.subList(fromIndex, toIndex)
}
fun getList(): List<E> {
return list
}
fun setList(list: ArrayList<E>) {
this.list = list
}
}
控制器
@RequestMapping("validParam")
fun validParam(@Valid @RequestBody param: ListParam<ReqParam>): R {
return R.success("ok")
}