java中注释类型的自定义验证器

时间:2011-02-28 11:35:45

标签: java validation jsf

我有枚举:

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

}

和List,我有这些动物:

  

[Animal.DOG,Animal.CAT,Animal.COW,   Animal.DOG]

我创建了特殊的注释类型来使这个List有效:

  

@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;
    }

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

改变方法:

  

boolean value = hasDuplicateAnimal(animalList)

  

动物动物= giveMeDuplicateAnimal(animalList)

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

1 个答案:

答案 0 :(得分:0)

我在公共收藏中找到了Predicate Logic的经验。谓词是非常简单的逻辑单元(实现“公共布尔值(对象o)”),可以很容易地重用。 因此,您可以为集合中的dublicate动物编写条件,并使用相同的规则进行验证和过滤。