【问题标题】:custom validator for annotation type in javajava中注释类型的自定义验证器
【发布时间】:2011-02-28 11:35:45
【问题描述】:

我有枚举:

public enum Animal {
    DOG,
    CAT,
    BIRD,
    HORSE,
    COW;

}

和列表,我有这些动物:

[ Animal.DOG,Animal.CAT, Animal.COW, 动物.狗]

我创建了特殊的注释类型来验证这个列表:

@AnimalListConstaint

我还在属性文件(animal_en.properties)中本地化了参数化消息:

my.localized.message.for.animal.unique = "列表中的动物 {0} 不是唯一的" my.localized.message.for.animal.enemies= “动物 {0} 和 {1} 不能在 名单,因为他们是敌人”

我的验证器应该检查这两个条件:

  • 我的列表是唯一的吗?
  • 在我的名单上是敌对动物(例如猫和狗)

所以我写了验证方法(我的类实现了ConstraintValidator):

 public boolean isValid(final List<Animal> animalList, final ConstraintValidatorContext context) {
        context.disableDefaultConstraintViolation();
        boolean result = true;

        if (hasDuplicateAnimal(animalList)) {
            context.buildConstraintViolationWithTemplate("{my.localized.message.for.animal.unique}")
                    .addConstraintViolation();
            result = false;
        }

        if (hasEnemiesInList(animalList)) {
            context.buildConstraintViolationWithTemplate("{my.localized.message.for.animal.enemies}")
                    .addConstraintViolation();
            result = false;
        }

        return result;
    }

这个验证器向我抛出了本地化消息,但现在我想添加参数:

改变方法:

布尔值 = hasDuplicateAnimal(animalList)

动物 = giveMeDuplicateAnimal(animalList)

如果我有重复的动物,那么我把这个动物放在我的消息中。 我的问题是如何参数化这条消息?或者也许我应该选择不同的策略?

【问题讨论】:

    标签: java validation jsf


    【解决方案1】:

    我在 commons-collections 中找到了 Predicate Logic 的良好体验。谓词是非常简单的逻辑单元(实现“public boolean evaluate(Object o)”),可以很容易地重用。 因此,您可以为集合中的重复动物编写条件,并使用相同的规则进行验证和过滤。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-01
      • 1970-01-01
      • 2018-10-25
      相关资源
      最近更新 更多