gpt4 book ai didi

java - Hibernate Validator - 添加动态 ConstraintValidator

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:20:14 26 4
gpt4 key购买 nike

了解后Hibernate Custom Validators ,它让我对一个主题产生了兴趣,我是否可以创建一个基本注释,我可以在其中设置要使用的 validator ?

@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = validator().class)
public @interface CustomAnnotation {
public String message();
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
Class<? extends ConstraintValidator<? extends CustomAnnotation, Serializable>> validator();
}

这样我就可以以这种方式使用@CustomAnnotation

@CustomAnnotation(validator = CustomConstraintValidator.class, message = "validationMessage")
private Object fieldName;

最佳答案

我不推荐它,但你可以大致这样做:

@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = GenericValidatorBootstrapperValidator.class)
public @interface CustomAnnotation {
public String message();
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
Class<? extends ConstraintValidator<? extends CustomAnnotation, Serializable>> validator();
}

public class GenericValidatorBootstrapperValidator implements ConstraintValidator<CustomAnnotation, Object> {

private final ConstraintValidator validator;

@Override
public void initialize(CustomAnnotation constraintAnnotation) {
Class<? extends ConstraintValidator> validatorClass = constraintAnnotation.validator();
validator = validatorClass.newInstance();
validator.initialize( ... ); //TODO with what?
}

@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
return validator.isValid(value, context);
}
}

但同样,更喜欢特定的注释,它们更具表现力。

编辑

在你的评论之后,我认为你想要的是能够根据属性的返回类型设置不同的 validator

@CustomAnnotation
List<String> foo;

@CustomAnnotation
Table bar;

如果是这种情况,请在 @Constraint 注释中添加几个 validator 实现。

@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {ListValidatorImpl.class, TableValidatorImpl.class, ...})
public @interface CustomAnnotation {
public String message();
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}

public class ListValidatorImpl implements ConstraintValidator<CustomAnnotation, List> {

@Override
public boolean isValid(List value, ConstraintValidatorContext context) {
}
}

public class TableValidatorImpl implements ConstraintValidator<CustomAnnotation, Table> {

@Override
public boolean isValid(Table value, ConstraintValidatorContext context) {
}
}

您甚至可以通过 META/validation.xml 文件将约束注释与实现链接起来

<constraint-mappings
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/mapping validation-mapping-1.1.xsd"
xmlns="http://jboss.org/xml/ns/javax/validation/mapping" version="1.1">

<constraint-definition annotation="org.mycompany.CustomAnnotation">
<validated-by include-existing-validators="true">
<value>org.mycompany.EnumCustomValidatorImpl</value>
</validated-by>
</constraint-definition>
</constraint-mappings>

如果您需要更灵活的东西,我认为我最初的提议会奏效。在 GenericValidatorBootstrapperValidator isValid 方法中,您可以根据 value 参数的对象类型调用正确的 validator 实例(例如通过 instanceof)。

关于java - Hibernate Validator - 添加动态 ConstraintValidator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28360017/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com