当前位置: 首页 > 面试题库 >

JSR-303 Bean验证注释了多个字段

仉高昂
2023-03-14
问题内容

我刚刚开始测试JSR-303
Bean验证,并且想知道是否有可能。我们的应用程序中有一个用于所有String字段的默认正则表达式。如果我想使用bean验证来应用此功能,我想我需要在表单对象中注释每个字段。

@Pattern(regexp = REG_EXP)
private String aString;

@Pattern(regexp = REG_EXP)
private String anotherString;

一击是否可以将@Pattern应用于所有字符串(或某些字段)?我们正在WebLogic
10.3.4上使用Hibernate实现,并以JSF2.0为前端。验证应该独立于视图,因为我可能来自Web服务。


问题答案:

要一次验证多个字段,请在类型级别上使用注释,并编写一个自定义的验证器,以使用REGEXP检查所有字符串字段。

编辑:提供示例。这很丑陋,因为它使用了Reflection并违反了安全性,但是也许它给了您一个总体思路。如果您不使用“对象”而是一个具体的类或接口,则使用常规的吸气剂可能会成功。

被测类(和跑步者)

   import javax.validation.Validation;
import javax.validation.Validator;

import validation.AllStringsRegex;

@AllStringsRegex(value="l")
public class UnderValidation {
    String a;
    String b;

   public static void main(String... args) {
       UnderValidation object = new UnderValidation();
       object.a = "hello";
       object.b = "world";

       Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
       System.out.println(validator.validate(object));
   }
}

我的注释:

@Target( { TYPE, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = AllStringsRegexValidator.class)
@Documented
public @interface AllStringsRegex {
    String message() default "String not regex";
    String value() default "";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

我的验证器

public class AllStringsRegexValidator implements ConstraintValidator<AllStringsRegex, Object> {
    private Pattern pattern = null;

    @Override
    public void initialize(AllStringsRegex annotation) {
        pattern = Pattern.compile(annotation.value());
    }

    @Override
    public boolean isValid(Object object, ConstraintValidatorContext ctx) {
        for (Field f : object.getClass().getDeclaredFields()) {
            if (f.getType().equals(String.class)) {
                try {
                    f.setAccessible(true);
                    String value = (String)f.get(object);
                    if (!pattern.matcher(value).find()) {
                        return false;
                    }
                }
                catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
        return true;
    }
}


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

  • 问题内容: 我有如下测试: 具有以下输出: 但是,我希望注释可以被覆盖,并且不会出现警告。 有没有办法做到这一点? 编辑:我发现一个错误似乎与此有关,但我最终运行4.2.0,仍然得到上述行为。 问题答案: 实际上,JSR-303不支持覆盖验证注释。相反,子类中重写方法的注释将 累积 应用:从规范的3.3节开始:

  • 我们正在开发REST服务,并希望使用JSR303进行输入数据验证,但这里的问题是所有模型对象都是从groovy DSL生成的,并将作为jars导入。因此,在对象字段之上编写JSR-303注释没有灵活性。 那么,有没有其他方法可以不用注释使用JSR-303,可以通过XML配置吗?或者在这种情况下,请提供任何验证建议。 谢啦

  • 问题内容: 有没有一种方法可以使用此处定义的注释来定义Hibernate验证规则,说明至少一个字段不能为null? 这将是一个假设的示例(实际上不存在): 在所示的情况下,fieldA可以为null或fieldB可以为null,但不能同时为两者。 一种方法是创建自己的验证器,但是我想避免它已经存在。如果您已经验证过,请分享一个验证人…谢谢! 问题答案: 我终于写了整个验证器: 用法示例:

  • Spring还支持基于JSR-250的注释,包括@ PostConstruct,@ PreDestroy和@Resource注释。 虽然这些注释并不是真的需要,因为你已经有了其他的替代品,但让我们对它们进行简要的了解。 @PostConstruct和@PreDestroy注释 要定义bean的设置和拆卸,我们只需使用init-method和/或destroy-method参数声明<bean>。 i

  • 我正在使用JSR303,并编写了大量注释,因此我熟悉使用自定义约束的过程。 我刚刚遇到了一个问题,我不确定我能否优雅地解决。这里的对象是为了说明!所以我有一个祖父母对象,它有一个孩子的列表。每个孩子都有自己的孩子列表(显然是祖父母的孙子)。此列表的大小可以用@size约束。但我需要限制祖父母的(孙子)总数,这样,如果我验证祖父母实例,他们在所有子女中的孙子数量限制为50个。举个奇怪的例子,我知道: