春季请求验证不起作用

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注解驱动了吗?&lt;mvc:annotation-driven /&gt; 你是否启用了 web mvc,你的类路径上是否有验证器实现(不仅仅是 api)! 是的,注释驱动已启用。如果这就是您的意思,我们有 hibernate-validator。 【参考方案1】:

我认为注解@Valid 应该在@RequestBody 之前

【讨论】:

试过了,但我仍然得到 result.hasErrors() = false :( 当您发布 testDTO 对象时,它的内部是什么?测试字段是否为空? 是的,我只是使用 Chrome 海报,然后发布一个空 JSON 如果我理解正确的话,它看起来不像:test:""?也许您应该尝试使用要验证的空字段发布它。此外,您没有回答我关于 testDTO 对象内部内容的问题(我的意思是哪些值具有您试图在您的 post 方法中验证的字段)。 我不明白你的问题 - 正如我所说,我发布了一个空 JSON,如下所示:。如果我发布类似 "test" : "" 的内容,那么测试字段不为空(它是 ""),所以无论如何它应该是有效的。

以上是关于春季请求验证不起作用的主要内容,如果未能解决你的问题,请参考以下文章

春季安全+休息不起作用

CORS过滤器在春季不起作用

总线刷新端点在春季云 Finchley.M8 中不起作用

春季启动@Transactional 不起作用

春季数据 findByStartDateBetween 不起作用

春季侦探行李传播不起作用