首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java Spring Rest验证配置属性访问

Java Spring Rest验证配置属性访问
EN

Stack Overflow用户
提问于 2016-08-26 18:25:56
回答 2查看 7.6K关注 0票数 9

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

当我试图验证另一个对象中的一个对象时,我得到了以下错误。

代码语言:javascript
复制
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数据模型:

代码语言:javascript
复制
{ // @Valid MessageDTO
  "title": "Test",
  "message":"Test",
  "client": { // @Valid ClientDTO
    "application": "Test"
  }
}

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

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

使用使用以下依赖项:

代码语言:javascript
复制
<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>

编辑:

控制器:

代码语言:javascript
复制
@RequestMapping(path = "/send", method = { RequestMethod.POST, RequestMethod.PUT })
public void send(@Valid @RequestBody MessageDTO message)

MessageDTO:

代码语言:javascript
复制
public class MessageDTO {

    ...

    @Valid
    @NotNull
    public ClientDTO client;

}

ClientDTO:

代码语言:javascript
复制
public class ClientDTO {

    ...

    @NotEmpty
    public String application;

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-19 15:39:19

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

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

代码语言:javascript
复制
@ControllerAdvice    
public class CustomControllerAdvice {

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

    ...
}
票数 23
EN

Stack Overflow用户

发布于 2018-10-29 22:46:39

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

代码语言:javascript
复制
public class MessageDTO {

    ...

    @Valid
    @NotNull
    public ClientDTO client;

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

}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39164077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档