java - 级联 bean 验证 2.0 不适用于 Map 内的嵌套对象

标签 java spring-boot validation bean-validation

虽然这个问题已经得到解答,但我很感兴趣为什么 @Validated需要 Map<String, @Valid Employee> 的工作级联验证.

更新 2:为了更深入地了解,我找到了这些帖子( OneTwoThree ),其中解释了 @Validated需要激活方法级验证。在此帮助下,可以验证集合,因为它们不是要验证的 JavaBean(JSR 303)。

<小时/>

解决方案:我已使用工作代码示例更新了我的代码片段和存储库。我所要做的就是用 @Validated 注释我的 Controller 并在Employee中添加一些 setter/getter 。 MethodValidationPostProcessor根本没有必要。

更新:我更新了我的问题并 fork 了 Spring Boot Rest 示例,以添加一个最小的 Rest API 来演示:

Github Repo 。 示例值位于 README.md 中!

<小时/>

我有一个 Spring Boot 2 API 来存储一些员工。我可以通过任一 EmployeeMap<String, Employee> .

@Validated //this is the solution to activate map validation
@RestController
class EmployeeController {

  @PostMapping("/employees")
  List<Employee> newEmployee(@RequestBody @Valid Employee newEmployee) {
     ...
  }

  @PostMapping("/employees/bulk")
  List<Employee> newEmployee(@RequestBody Map<String, @Valid Employee> 
  newEmployees) {
     ...
  }
}

Employee 存在一些内部静态类,也需要验证:

public class Employee {

    @NotBlank
    public final String name;
    @Valid
    public final EmployeeRole role;

    @JsonCreator
    public Employee(@JsonProperty("name") String name,
        @JsonProperty("role") EmployeeRole role) {

        this.name = name;
        this.role = role;
    }

    // getters

    public static class EmployeeRole {

        @NotBlank
        public String rolename;

        @Min(0)
        public int rating;

        @JsonCreator
        public EmployeeRole(@JsonProperty("rolename") String rolename,
            @JsonProperty("rating") int rating) {

            this.rolename = rolename;
            this.rating = rating;
        }

        // getters
    }
}


目前,单个请求的验证有效,但批量请求的验证无效。据我所知,Bean 验证 2.0 应该可以实现这一点。

你知道我做错了什么吗?我需要编写自定义 validator 吗?

最佳答案

要使其正常工作,您必须执行以下操作:

Add MethodValidationPostProcessor bean to configuration

@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
    return new MethodValidationPostProcessor();
}

Add @Validated to your EmployeeController

@Validated
@RestController
public class EmployeeController {}'

Add @Valid to Map or to Employee

public List<Employee> newEmployee(@RequestBody @Valid Map<String, Employee> newEmployees) {}   
public List<Employee> newEmployee(@RequestBody Map<String, @Valid Employee> newEmployees) {}

仅此而已。这是整个EmployeeController:

@Validated
@RestController
public class EmployeeController {

    @PostMapping("/employees")
    public List<Employee> newEmployee(@RequestBody @Valid Employee newEmployee) {
        return Collections.singletonList(newEmployee);
    }

    @PostMapping("/employees/bulk")
    public List<Employee> newEmployee(@RequestBody @Valid Map<String, Employee> newEmployees) {
        return new ArrayList<>(newEmployees.values());
    }
}

以及SpringBoot配置文件

@SpringBootApplication
public class Application extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    public MethodValidationPostProcessor methodValidationPostProcessor() {
        return new MethodValidationPostProcessor();
    }

}

希望对您有帮助。

关于java - 级联 bean 验证 2.0 不适用于 Map 内的嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60167961/

相关文章:

java - 从远程文件读取字符串 - Java

asp.net - 构建时验证所有 ASPX、ASCX 和 HTML 文件

ruby-on-rails-3 - 如何编写依赖于类的多个属性的 Ruby on Rails 验证?

javascript - 输入类型 ="text"表单提交时忽略最大长度验证

java - 循环遍历ArrayList

java - 月份和 java.util.Formatter

spring-boot - Gerrit-错误:在文件Gradle/wrapper/gradle-wrapper.jar中找到回车符(CR)

spring-boot - 如何禁用transport.failover.FailoverTransport 成功连接到tcp ://localhost:61616 message

spring - 我应该在哪里存储 Spring Boot 项目的开发凭证?

Java资源-游戏模拟