Пользовательский валидатор для типа аннотации в Java - PullRequest
1 голос
/ 28 февраля 2011

У меня есть enum:

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

}

и список, где у меня есть эти животные:

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

Я создаю специальный тип аннотации для проверки этого списка:

@ AnimalListConstaint

Я также локализовал, параметризованное сообщение в файле свойств(animal_en.properties):

my.localized.message.for.animal.unique = "Животное {0} в списке не является уникальным" my.localized.message.for.animal.enemies =«Животное {0} и {1} не может быть в списке, потому что они враги»

И мой валидатор должен проверить это два условия:

  • Isмой список уникален?
  • В моем списке враги животные (например, кошка и собака)

Поэтому я пишу метод проверки (мой класс реализует 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;
    }

и этот валидатор выдал мне локализованное сообщение, но теперь я хотел бы добавить параметры:

изменить метод:

логическое value = hasDuplicateAnimal (animalList)

до

Animal animal = giveMeDuplicateAnimal (animalList)

и если у меня есть дубликаты животных, то яПоместите это животное в мое сообщение.У меня вопрос как параметризовать это сообщение?Или, может быть, я должен выбрать другую стратегию?

1 Ответ

0 голосов
/ 28 февраля 2011

Я получил хороший опыт работы с логикой предикатов, которую можно найти в общих коллекциях. Предикаты являются очень простыми логическими единицами (реализующими "public booleanvaluate (Object o)"), которые можно легко использовать повторно. Таким образом, вы можете написать условия для дублирования животных в коллекциях и использовать одно и то же правило для проверки и фильтрации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...