春季请求验证不起作用
Posted
技术标签:
【中文标题】春季请求验证不起作用【英文标题】:Spring request validation not working 【发布时间】:2016-01-19 08:06:30 【问题描述】:我们正在尝试使用 spring 对请求进行输入验证。我们遵循了本教程:http://spring.io/guides/gs/validating-form-input/,但它似乎不起作用。看起来@NotNull
和/或@Valid
由于某种原因被忽略了。
例如,我们有以下控制器:
@RequestMapping(value = "/test", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(value = HttpStatus.OK)
@ResponseBody
public void test(@RequestBody @Valid TestDTO testDTO, BindingResult result)
this.validateDTO(result);
protected void validateDTO(BindingResult result)
if (result.hasErrors())
List<FieldError> fieldErrors = result.getFieldErrors();
throw new FieldValidationException(fieldErrors);
TestDTO 是以下类:
public class TestDTO
@NotNull
private String test;
...
所以我们期望,当发布一个没有test
字段的请求时,FieldValidationException
将被抛出。但是,这不会发生,因为 result.hasErrors()
= false 出于某种原因。
有人知道为什么会这样吗?以及如何解决?
编辑:我们尝试将验证器 bean 添加到我们的 xml:
<beans:bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />
但是现在我们启动服务器时出现以下异常:java.lang.NoClassDefFoundError: javax/validation/ValidatorFactory
。
我们有以下 gradle 依赖项,据我了解,这些版本应该兼容:
compile group:'javax.validation', name:'validation-api', version:'1.1.0.Final'
compile group:'org.hibernate', name:'hibernate-validator', version:'5.2.2.Final'
【问题讨论】:
你开启mvc注解驱动了吗?<mvc:annotation-driven />
你是否启用了 web mvc,你的类路径上是否有验证器实现(不仅仅是 api)!
是的,注释驱动已启用。如果这就是您的意思,我们有 hibernate-validator。
【参考方案1】:
我认为注解@Valid 应该在@RequestBody 之前
【讨论】:
试过了,但我仍然得到 result.hasErrors() = false :( 当您发布 testDTO 对象时,它的内部是什么?测试字段是否为空? 是的,我只是使用 Chrome 海报,然后发布一个空 JSON 如果我理解正确的话,它看起来不像:test:""?也许您应该尝试使用要验证的空字段发布它。此外,您没有回答我关于 testDTO 对象内部内容的问题(我的意思是哪些值具有您试图在您的 post 方法中验证的字段)。 我不明白你的问题 - 正如我所说,我发布了一个空 JSON,如下所示:。如果我发布类似 "test" : "" 的内容,那么测试字段不为空(它是 ""),所以无论如何它应该是有效的。以上是关于春季请求验证不起作用的主要内容,如果未能解决你的问题,请参考以下文章