Расширение @NotEmpty для принятия других классов - PullRequest
2 голосов
/ 21 февраля 2012

Я пытался создать собственный валидатор, чтобы я мог просто использовать аннотацию @NotEmpty для определенных классов (в данном случае java.util.Calendar или CommandItem). Но я получаю исключение:

javax.validation.UnexpectedTypeException: No validator could be found for type: com.bla.DocumentCommandItem 

Теперь, единственное, что я могу придумать, почему это не работает, это то, что сама аннотация @NotEmpty объявляет это:

@Constraint(validatedBy = { })

Так что нет прямой связи с классом Validator. Но тогда как он проверяет строки и коллекции?

Это мой класс Validator:

    public class DocumentNotEmptyExtender implements ConstraintValidator<NotEmpty,DocumentCommandItem> {

@Override
public void initialize( NotEmpty annotation ) {
}

@Override
public boolean isValid( DocumentCommandItem cmdItem, ConstraintValidatorContext context ) {
    if ( !StringUtils.hasText( cmdItem.getId() ) && (cmdItem.getFilename() == null || cmdItem.getFilename().isEmpty()) ) {
        return false;
    } else {
        return true;
    }
}

}

Это вообще возможно?

(в качестве примечания ... Я также получил это исключение, когда делал свою аналогичную аннотацию, но таинственно исчезла).

Спасибо!

Ответы [ 2 ]

3 голосов
/ 22 февраля 2012

Вы должны зарегистрировать свой валидатор в файле отображения ограничений следующим образом:

<constraint-mappings
    xmlns="http://jboss.org/xml/ns/javax/validation/mapping"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation=
        "http://jboss.org/xml/ns/javax/validation/mapping validation-mapping-1.0.xsd">

    <constraint-definition annotation="org.hibernate.validator.constraints.NotEmpty">
        <validated-by include-existing-validators="true">
            <value>com.foo.NotEmptyValidatorForDocumentCommandItem</value>
        </validated-by>
    </constraint-definition>
</constraint-mappings>

Этот файл сопоставления должен быть зарегистрирован в META-INF/validation.xml:

<validation-config xmlns="http://jboss.org/xml/ns/javax/validation/configuration"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/configuration">

    <constraint-mapping>/your-mapping.xml</constraint-mapping>
</validation-config>

Подробнее об этом можно узнать в справочном руководстве для Hibernate Validator и в спецификации Bean Validation .

2 голосов
/ 22 февраля 2012

Решение перечислено выше @ Gunnar

Это вызвало несколько неожиданных вещей, хотя ...

NotEmpty в основном является оболочкой для ограничений @NotNull и @Size (min = 1). Так что нет фактической реализации @NotEmpty.

Создание собственной реализации @NotEmpty для DocumentCommandItem вызвало 2 вещи:

  • Валидатор, запускающий проверку NotNull и Size (и, следовательно, «не найден валидатор» для комбинированного объекта Size-DocumentCommandItem
  • Что еще более важно, валидации Size-String начали давать сбой, потому что не удалось найти реализацию для него.

Итак, мое окончательное решение этой проблемы:

Создание реализации @Size для DocumentCommandItem А также Сделайте реализацию @NotEmpty для String

(и, возможно, мне придется сделать еще один @NotEmpty для коллекций)

...