Java Spring 其余验证配置 属性 访问
Java Spring Rest validation configure property access
我有一个 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 定义,因为在我看来,它是无用的噪音。
我不想 to/can 轻易地向我的 DTO 添加 getter 或 setter 那么我如何才能按照该错误消息配置我的 DataBinder 以使用 "direct field access"?我想为此使用 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)
MessageDTO:
public class MessageDTO {
...
@Valid
@NotNull
public ClientDTO client;
}
ClientDTO:
public class ClientDTO {
...
@NotEmpty
public String application;
}
我偶然发现了同样的问题,并为我们找到了解决方案,只是想分享它。
在资源或 @ControllerAdvice
中,您可以配置 Spring DataBinder 以使用直接字段访问。
@ControllerAdvice
public class CustomControllerAdvice {
@InitBinder
private void activateDirectFieldAccess(DataBinder dataBinder) {
dataBinder.initDirectFieldAccess();
}
...
}
对我来说,解决方案是向 DTO 添加 getter 和 setter
public class MessageDTO {
...
@Valid
@NotNull
public ClientDTO client;
@NotNull public ClientDTO getClient() { return client; }
public void setClient(@NotNull ClientDTO client) { this.client = client; }
}
我有一个 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 定义,因为在我看来,它是无用的噪音。
我不想 to/can 轻易地向我的 DTO 添加 getter 或 setter 那么我如何才能按照该错误消息配置我的 DataBinder 以使用 "direct field access"?我想为此使用 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)
MessageDTO:
public class MessageDTO {
...
@Valid
@NotNull
public ClientDTO client;
}
ClientDTO:
public class ClientDTO {
...
@NotEmpty
public String application;
}
我偶然发现了同样的问题,并为我们找到了解决方案,只是想分享它。
在资源或 @ControllerAdvice
中,您可以配置 Spring DataBinder 以使用直接字段访问。
@ControllerAdvice
public class CustomControllerAdvice {
@InitBinder
private void activateDirectFieldAccess(DataBinder dataBinder) {
dataBinder.initDirectFieldAccess();
}
...
}
对我来说,解决方案是向 DTO 添加 getter 和 setter
public class MessageDTO {
...
@Valid
@NotNull
public ClientDTO client;
@NotNull public ClientDTO getClient() { return client; }
public void setClient(@NotNull ClientDTO client) { this.client = client; }
}