hibernate-validator校验对象属性为List

简介: hibernate-validator校验对象属性为List

君子拙于不知己而信于知己也——司马迁

文档:

https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#_with_list

我们这里首先引入starter

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>


然后我们带两个Entity以及一个Controller

package com.ruben.simplestreamquery.pojo;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;
@Data
public class TestEntity {
    @NotNull
    private Long id;
    @NotEmpty
    private List<EntityItem> list;
}
package com.ruben.simplestreamquery.pojo;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
 * @author VampireAchao
 * @since 2022/12/20 14:57
 */
@Data
public class EntityItem {
    @NotNull
    private Long id;
}
package com.ruben.simplestreamquery.controller;
import com.ruben.simplestreamquery.pojo.TestEntity;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
/**
 * TestController
 *
 * @author VampireAchao
 * @since 2022/10/5
 */
@Slf4j
@RestController
public class TestController {
    @PostMapping("test")
    public void list(@RequestBody @Validated TestEntity testEntity) {
        log.info("请求成功!{}", testEntity);
    }
}

我们编写一个Mock

package com.ruben.simplestreamquery;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ruben.simplestreamquery.pojo.EntityItem;
import com.ruben.simplestreamquery.pojo.TestEntity;
import io.github.vampireachao.stream.core.collection.Lists;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
/**
 * @author VampireAchao
 * @since 2022/12/20 13:48
 */
@SpringBootTest
@AutoConfigureMockMvc
class TestControllerTest {
    @Test
    void test(@Autowired MockMvc mockMvc, @Autowired ObjectMapper objectMapper) throws Exception {
        final TestEntity entity = new TestEntity();
        entity.setId(1L);
        entity.setList(Lists.of(new EntityItem()));
        final String jsonStr = objectMapper.writeValueAsString(entity);
        mockMvc.perform(post("/test")
                        .contentType("application/json")
                        .content(jsonStr))
                .andExpect(status().isOk());
    }
}

此时我们对List的校验失效了

如何生效?

List加上@Valid注解

package com.ruben.simplestreamquery.pojo;
import lombok.Data;
import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;
@Data
public class TestEntity {
    @NotNull
    private Long id;
    @NotEmpty
    private List<@Valid EntityItem> list;
}

再次测试

校验生效了

我们稍微封装一下异常处理

package com.ruben.simplestreamquery.handler;
import com.ruben.simplestreamquery.pojo.vo.GlobalResult;
import io.github.vampireachao.stream.core.stream.Steam;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.List;
/**
 * ResponseHandler
 *
 * @author VampireAchao
 * @since 2022/10/5
 */
@RestControllerAdvice
public class ResponseHandler {
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public GlobalResult parameterValidatorResolver(MethodArgumentNotValidException e) {
        List<FieldError> errors = e.getBindingResult().getFieldErrors();
        final GlobalResult result = GlobalResult.error();
        result.set("msg", Steam.of(errors).map(error -> error.getField() + " " + error.getDefaultMessage()).join("  "));
        return result;
    }
}

然后打印出来响应结果

package com.ruben.simplestreamquery;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ruben.simplestreamquery.pojo.EntityItem;
import com.ruben.simplestreamquery.pojo.TestEntity;
import io.github.vampireachao.stream.core.collection.Lists;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
/**
 * @author VampireAchao
 * @since 2022/12/20 13:48
 */
@Slf4j
@SpringBootTest
@AutoConfigureMockMvc
class TestControllerTest {
    @Test
    void test(@Autowired MockMvc mockMvc, @Autowired ObjectMapper objectMapper) throws Exception {
        final TestEntity entity = new TestEntity();
        entity.setId(1L);
        entity.setList(Lists.of(new EntityItem()));
        final String jsonStr = objectMapper.writeValueAsString(entity);
        final MvcResult result = mockMvc.perform(post("/test")
                        .contentType("application/json")
                        .content(jsonStr))
                .andExpect(status().isOk())
                .andReturn();
        log.info(result.getResponse().getContentAsString());
    }
}

成功提示

相关文章
|
2月前
|
Java
java8中List对象转另一个List对象
java8中List对象转另一个List对象
39 0
|
4月前
|
数据处理
利用Stream流将取到的对象List<对象>形式数据进行分组统计转变成Map<分组条件,数量统计>形式
利用Stream流将取到的对象List<对象>形式数据进行分组统计转变成Map<分组条件,数量统计>形式
24 0
|
5天前
|
SQL Java
【SpringBoot】List<实体类>如何去重,单、多属性去重
【SpringBoot】List<实体类>如何去重,单、多属性去重
8 0
|
2月前
|
Java API
java 对象list 使用stream进行过滤
在Java中,你可以使用Stream API对对象列表进行过滤。假设你有一个`List<MyObject>`,并且你想根据某些条件过滤出特定的对象。以下是一个示例: ```java import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<MyObject> myObjects = ... // 初始化你的对象列表 List<MyObject> filter
|
4月前
|
前端开发 Java 测试技术
把List<对象>转变<String,List<对象>>形式,k为判断的值,v为k重复的数据。
把List<对象>转变<String,List<对象>>形式,k为判断的值,v为k重复的数据。
21 0
|
4月前
|
存储 Java API
利用Stream流将取到的对象List<对象>形式数据进行分组统计转变成Map<分组条件,数量统计>形式
利用Stream流将取到的对象List<对象>形式数据进行分组统计转变成Map<分组条件,数量统计>形式
27 0
|
5月前
|
Java
Java【代码分享 11】yaml配置List和Map参数对象的配置信息及类文件实例分享(效仿GatewayDynamic+DynamicDataSource的注入方法)
Java【代码分享 11】yaml配置List和Map参数对象的配置信息及类文件实例分享(效仿GatewayDynamic+DynamicDataSource的注入方法)
54 0
|
5月前
|
SQL JSON Java
Java【问题记录 02】对象封装+固定排序+list All elements are null引起的异常处理+Missing artifact com.sun:tools:jar:1.8.0
Java【问题记录 02】对象封装+固定排序+list All elements are null引起的异常处理+Missing artifact com.sun:tools:jar:1.8.0
43 0
|
5月前
|
Oracle Java 关系型数据库
Java【代码分享 06】Lamda表达式将List对象中的Map对象的key全部转化为大写或者小写(去除外层循环:可用于Map对象中的key全部转化为大写或者小写)
Java【代码分享 06】Lamda表达式将List对象中的Map对象的key全部转化为大写或者小写(去除外层循环:可用于Map对象中的key全部转化为大写或者小写)
68 0
|
5月前
|
XML Java 数据格式
spring怎么去引用/注入集合/数组类型和 怎么通过 util 名称空间创建 list以及 怎么去通过级联属性赋值
spring怎么去引用/注入集合/数组类型和 怎么通过 util 名称空间创建 list以及 怎么去通过级联属性赋值
33 0