当前位置: 首页 > 知识库问答 >
问题:

在JSR-303自定义验证器初始化方法中键入check

段干长恨
2023-03-14

我试图创建一个类级别的JSR-303验证定义,用于检查一个属性是否在时间上先于另一个属性出现。因为这个验证只对日历属性有意义,所以我想知道是否可以在initialize方法中测试属性类型。

我的注释定义是:

@Target({TYPE, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = TemporalSequenceValidator.class)
@Documented
public @interface TemporalSequence {

    String message() default "{uk.co.zodiac2000.vcms.constraints.TemporalSequence}";
    Class<?>[] groups() default {};    
    Class<? extends Payload>[] payload() default {};
    String first();
    String second();
}

以及验证程序实现:

public class TemporalSequenceValidator implements 
    ConstraintValidator<TemporalSequence, Object> {
    private String firstFieldName;
    private String secondFieldName;

    @Override
    public void initialize(final TemporalSequence constraintAnnotation) {
        firstFieldName = constraintAnnotation.first();
        secondFieldName = constraintAnnotation.second();
        // Is it possible to test type of firstFieldName and
        // secondFieldName properties here?
    }

    @Override
    public boolean isValid(final Object value, final ConstraintValidatorContext context) {
        // omitted
    }
}

这样做明智吗?如果明智,您建议我使用什么方法?如果属性类型不正确,应该采取什么行动?

共有1个答案

谷梁承宣
2023-03-14

由于无法访问已验证的对象,因此无法真正执行签入的操作。相反,您可以使用反射来检查isValid()中已验证对象的字段类型:

if ( !Calendar.class.isAssignableFrom( 
    value.getClass().getField( firstFieldName ).getType() ) ) {
    throw new ValidationException( "Field " + firstFieldName + " is not of type Calendar." );
}
 类似资料:
  • 我正在用Spring和Thymeleaf填表: MyForm如下所示: 正如您所看到的,我做了一个自定义注释,它应该检查输入值是否可以解析为: 现在在我的Controller类中,我正在执行以下操作: 但是,当试图将放入文本字段以测试验证时,获取: 下面是我读到的示例,并希望用自定义验证器进行扩展:http://viralpatel.net/blogs/spring-mvc-hashmap-for

  • 我有一个可以创建和编辑组的应用程序。每个团体都有一个独特的头衔。当有人试图创建新组时,我会检查是否有具有该标题的组,如果有,则验证失败。问题是,当有人试图编辑组而不更改标题时,根据我的自定义验证,有一个组具有该标题(有人正在编辑的标题),而我的验证失败,因此用户无法保存该组。所以我想问一下,是否有人能解决这个问题。非常感谢您的回答! 我的班级 我的验证器接口 我的验证器

  • 我的bean中有两个字段 当字段key=“A”,“value”应该跟在其他“key”的特定Regex后面时,它可以是任何内容。 如何根据键定义此值验证。

  • 编写自定义约束时,一个验证器实现可以验证多个注释。例如,我有几个注释,它们规定了不同的@size注释,但我希望它们都指向同一个验证器类,该类执行一些全局检查,即所有注释都必须与某个正则表达式匹配。据我所知,该实现采用了一种注释类型。 一个注释 验证器

  • 我注意到,在Spring中,当声明使用注释的自定义验证器bean时,JSR-303验证被完全忽略。有趣的是,自定义验证器甚至不需要任何类填写或使用。Spring扫描其组件的事实似乎足以让Spring在对象绑定期间跳过JSR-303验证。从自定义验证器中删除,然后重新启动web应用程序,即可按预期启用JSR-303验证。使用注释自定义验证器有其用途,例如使用Spring Autowire依赖项。 考

  • 我试图为我的模型类实现一个自定义验证器,该验证器依赖于我的自定义bean(通过声明)。在本文中,我遵循了有关该主题的Spring文档。我的对象是根据本教程实现的。 但是,在运行我的测试时,对象中的autowired属性总是。为什么会这样? 以下是我的代码的相关部分: 我的自定义bean, 我的自定义约束 存储库使用Spring Data JPA的