【问题标题】:spring validation annotations being ignored when using custom validator使用自定义验证器时忽略弹簧验证注释
【发布时间】:2013-02-11 17:17:33
【问题描述】:

我正在尝试将带注释的验证规则与一些自定义验证结合起来。我有一个如下所示的详细信息实体:

public class DetailsEntity {    
    @NotEmpty(message = "Name is required")
    private String name;
    private String customField;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCustomField() {
        return customField;
    }

    public void setCustomField(String customField) {
        this.customField = customField;
    }
}

然后我有一个如下所示的控制器:

@Controller
public class EntityController {

    @RequestMapping(value = "/create", method = RequestMethod.POST)
    public @ResponseBody DetailsEntity create(@RequestBody @Valid
        DetailsEntity details) {
        //Do some creation work
    }
}

这一切开箱即用。问题是当我尝试将自定义验证器与我的实体一起使用时。我的验证器如下所示:

@Component
public class EntityValidator implements Validator {

    @Override
    public boolean supports(Class<?> aClass) {
        return aClass.isAssignableFrom(DetailsEntity.class);
    }

    @Override
    public void validate(Object o, Errors errors) {
        DetailsEntity entity = (DetailsEntity) o;
        if (entity.getCustomField().equals("Some bad value")) {
            errors.reject("Bad custom value supplied");
        }
    }
}

我尝试了两种方式注入我的验证器。一种是在控制器中使用@InitBinder,另一种是在spring配置中设置一个全局验证器(&lt;mvc:annotation-driven validator="entityValidator" /&gt;)。无论哪种方式,自定义验证器都可以正常工作,但是我的 @NotEmpty 注释被忽略了。如何同时使用注释和自定义验证器?

【问题讨论】:

    标签: java spring validation annotations


    【解决方案1】:

    使用 SpringValidatorAdapter 作为自定义验证器的基类并覆盖 validate() 方法:

    public void validate(Object target, Errors errors) {
                    // check JSR-303 Constraints
            super.validate(target, errors);
                    // Add you custom validation here.
    
        }
    

    或者在您的自定义验证器中注入 LocalValidationFactoryBean 并在您的自定义验证之前或之后调用 validate(target, errors)。

    【讨论】:

    • 这让我走上了正确的道路,最终看到了这个页面:nonrepeatable.blogspot.com/2010/04/…
    • 我要补充一点,如果要使用组验证,必须在 validate 方法中添加组。否则不会执行这些验证!
    【解决方案2】:

    @NotEmpty 是一个 JSR-303 注释,我们需要使用它的实现,例如 HiberanteValidator,我们需要将 Hibernate-Validator jar 添加到您的 lib 目录。使用这个 jar,我们可以使用 @NotEmpty、@NotNull...所有 JSR 303 注释。

    【讨论】:

    • 我来到这里是因为我希望 Spring 会拒绝我的无效请求,但它没有。通过简单地添加 org.hibernate.validator:hibernate-validator 依赖项来修复。这个答案优于公认的答案,因为它利用了 spring 内置功能,而不是自己做艰苦的工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 2020-05-03
    • 2019-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    相关资源
    最近更新 更多