【问题标题】:Java Spring Rest validation configure property accessJava Spring Rest 验证配置属性访问
【发布时间】:2016-08-26 10:25:55
【问题描述】:

我有一个使用注释驱动输入验证的 Spring-JSON/RestAPI。 @Valid

当我尝试在另一个对象中验证一个对象时出现以下错误。

java.lang.IllegalStateException: JSR-303 validated property 'client.application' does not have a corresponding accessor for Spring data binding - check your DataBinder's configuration (bean property versus direct field access)
    at org.springframework.validation.beanvalidation.SpringValidatorAdapter.processConstraintViolations(SpringValidatorAdapter.java:153) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE]
    at org.springframework.validation.beanvalidation.SpringValidatorAdapter.validate(SpringValidatorAdapter.java:108) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE]
    at org.springframework.validation.DataBinder.validate(DataBinder.java:866) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE]
    ...

这是这里使用的 json 数据模型:

{ // @Valid MessageDTO
  "title": "Test",
  "message":"Test",
  "client": { // @Valid ClientDTO
    "application": "Test"
  }
}

我在这里跳过 java 定义,因为它会是太多无用的噪音 IMO。

我不想/不能轻松地将 getter 或 setter 添加到我的 DTO,那么我该如何遵循该错误消息并将我的 DataBinder 配置为使用“直接字段访问”?我想为此使用 JavaConfig (@Configuration)。

使用使用以下依赖项:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>4.3.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.2.4.Final</version>
</dependency>

编辑:

控制器:

@RequestMapping(path = "/send", method = { RequestMethod.POST, RequestMethod.PUT })
public void send(@Valid @RequestBody MessageDTO message)

消息DTO:

public class MessageDTO {

    ...

    @Valid
    @NotNull
    public ClientDTO client;

}

客户端DTO:

public class ClientDTO {

    ...

    @NotEmpty
    public String application;

}

【问题讨论】:

  • 至少这些字段应该是公开的,不是吗?你可以注释字段吗?
  • 我已经添加了一些来源。如您所见,它们是公开的。如果我从MessageDTO#client 中删除@Valid,我不会得到异常,但它也不会得到递归验证。

标签: java spring maven validation hibernate-validator


【解决方案1】:

我偶然发现了同样的问题,并为我们找到了解决方案,并想分享它。

在 Resource 或 @ControllerAdvice 中,您可以配置 Spring DataBinder 以使用直接字段访问。

@ControllerAdvice    
public class CustomControllerAdvice {

    @InitBinder
    private void activateDirectFieldAccess(DataBinder dataBinder) {
        dataBinder.initDirectFieldAccess();
    }

    ...
}

【讨论】:

  • 谢谢。我将在下周测试并验证您的建议。
【解决方案2】:

对我来说,解决方案是将 getter 和 setter 添加到 DTO

public class MessageDTO {

    ...

    @Valid
    @NotNull
    public ClientDTO client;

    @NotNull public ClientDTO getClient() { return client; }
    public void setClient(@NotNull ClientDTO client) { this.client = client; }

}

【讨论】:

  • 只有吸气剂才能完成这项工作
猜你喜欢
  • 2021-05-10
  • 2014-12-01
  • 1970-01-01
  • 2015-01-23
  • 2015-03-22
  • 1970-01-01
  • 1970-01-01
  • 2014-04-18
  • 2018-12-19
相关资源
最近更新 更多