【问题标题】:Spring - Validation of custom constraintsSpring - 自定义约束的验证
【发布时间】:2018-01-29 11:29:09
【问题描述】:

我有一个自定义注解@UniqueModel,由ConstraintValidator 验证:

@Component
public class UniquePlaceValidator implements ConstraintValidator<UniqueModel, Model> {

    @Autowired
    private ModelRepository repository;

    public UniqueModelValidator() {
    }

    public void initialize(UniqueModel constraint) {
    }

    @Override
    public boolean isValid(Model model, ConstraintValidatorContext context) {
        if (repository == null)
            return true;

        Model dbModel = repository.findByNameAndMail(model.getName(), model.getMail());
        return dbModel == null;
    }

问题是,我需要在调用存储库的 safe() 方法之前进行验证,否则字段注入将不起作用。

为此,我创建了一个带有@Valid-annotation 的委托方法,以便在之前强制进行唯一验证:

Model save(@Valid Model model {
        return repository.save(model);
    }

不幸的是,这不起作用,似乎 @Valid-annotation 被 Spring 忽略了。

如何确保验证的正确时间?

【问题讨论】:

标签: java spring hibernate validation


【解决方案1】:

根据您的 Bean 验证配置,您可能需要使用 @ValidateOnExecution 注释您的存储库 bean。
但我不确定 Spring 是否支持此注释(请参阅 SPR-10641),因此我在我的存储库和服务接口和方法级别验证中使用 Spring 自己的 @Validated 注释工作正常!
另请参阅this question 并查看MethodValidationPostProcessor,其中明确指出“具有此类注释方法的目标类需要在类型级别使用 Spring 的 @Validated 注释进行注释”。因此,在修复 SPR-10641 之前,您必须使用 @Validated 而不是 @ValidateOnExecution 似乎很清楚。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    • 2013-11-15
    相关资源
    最近更新 更多