1

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

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

4

2 回答 2

2

用作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)。

于 2013-02-11T17:44:22.747 回答
1

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

于 2013-02-12T05:23:16.410 回答