使用自定义验证程序时,将忽略弹簧验证注释

时间:2013-02-11 17:17:33

标签: java spring validation annotations

我正在尝试合并带注释的验证规则以及一些自定义验证。我有一个详细信息实体,如下所示:

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,另一个是在弹簧配置(<mvc:annotation-driven validator="entityValidator" />)中设置全局验证器。无论哪种方式我都这样做,自定义验证器工作正常,但我的@NotEmpty注释被忽略。如何同时使用注释和自定义验证器?

2 个答案:

答案 0 :(得分:2)

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

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

    }

或者在自定义验证器中注入LocalValidationFactoryBean,并在自定义验证之前或之后调用验证(目标,错误)。

答案 1 :(得分:0)

@NotEmpty是一个JSR-303注释,我们需要像HiberanteValidator一样使用它的实现,我们需要在你的lib目录中添加Hibernate-Validator jar。使用这个jar我们可以使用@NotEmpty,@ NotNull ......所有JSR 303注释。