Java Spring Rest 验证配置属性访问

标签 java spring maven validation hibernate-validator

我有一个使用注释驱动输入验证的 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 定义,因为在我看来,它会是太多无用的噪音。

我不想/不能轻易地向我的 DTO 添加 getter 或 setter,那么我如何才能遵循该错误消息并将我的 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>

编辑:

Controller :

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

消息DTO:

public class MessageDTO {

    ...

    @Valid
    @NotNull
    public ClientDTO client;

}

客户端数据对象:

public class ClientDTO {

    ...

    @NotEmpty
    public String application;

}

最佳答案

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

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

@ControllerAdvice    
public class CustomControllerAdvice {

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

    ...
}

关于Java Spring Rest 验证配置属性访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39164077/

相关文章:

maven - 如何使用 maven 获取 OAuth 的 java 客户端库?

json - jackson-dataformat-xml 将@ResponseBody 转换为 XML

java - 调整标签大小以适合内容

java - 如何使用 maven mvn test 命令行运行动态 testng.xml?

java - 使用 Hibernate 在插入前检查重复值

java - 如何基于 Google Cloud Endpoints 为 API 编写测试?

java - 如何将 JOGL 与 NetBeans 平台捆绑在一起?

java - 当我从Java代码执行C++时未显示任何输出

java - @cacheable spring for redis,方法特定的ttl?

spring - 使用 Spring 内部 Spel 表达式解析器