Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Spring中配置@Valid上的直接字段访问?_Java_Spring_Spring Mvc_Spring Web - Fatal编程技术网

Java 如何在Spring中配置@Valid上的直接字段访问?

Java 如何在Spring中配置@Valid上的直接字段访问?,java,spring,spring-mvc,spring-web,Java,Spring,Spring Mvc,Spring Web,我如何告诉springweb验证我的dto而不必使用getter/setter @PostMapping(path = "/test") public void test(@Valid @RequestBody WebDTO dto) { } public class WebDTO { @Valid //triggers nested validation private List<Person> persons; //getter+setter for pe

我如何告诉
springweb
验证我的dto而不必使用getter/setter

@PostMapping(path = "/test")
public void test(@Valid @RequestBody WebDTO dto) {

}

public class WebDTO {
   @Valid //triggers nested validation
   private List<Person> persons;

   //getter+setter for person

   @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
   public static class Person {
         @NotBlank
         public String name;
         public int age;
   }
}
特殊要求:我仍然希望在布尔getter上添加
@AssertTrue
,以提供跨字段验证,如:

    @AssertTrue
    @XmlTransient
    @JsonIgnore
    public boolean isNameValid() {
        //...
    }

您必须将SpringDataBinder配置为使用直接字段访问

@ControllerAdvice    
public class ControllerAdviceConfiguration {
    @InitBinder
    private void initDirectFieldAccess(DataBinder dataBinder) {
        dataBinder.initDirectFieldAccess();
    }
}

试着这样做:

@Access(AccessType.FIELD)
public String name;

总的来说,这是可行的。唯一的缺点:现在,仅方法字段上的
@AssertTrue
会导致JSR-303验证异常。因为这些方法背后没有本地字段。我是否有可能合并字段访问,尽管让spring评估没有字段的带注释的方法
@AssertTrue
?您可以在控制器类中添加init方法或initbinder。
@Access(AccessType.FIELD)
public String name;