JPA - не найден валидатор для типа: enum - PullRequest
22 голосов
/ 04 августа 2011

У меня есть класс сущности, который использует тип enum для одного из свойств, и я получаю следующее исключение при попытке сохранить сущность:

javax.validation.UnexpectedTypeException: No validator could be found for type: model.schema.BaseYesNo

Есть идеи, почему это может происходить? Я думаю, что, поскольку это перечисление, оно должно быть проверено компилятором, поэтому нет необходимости в каком-либо валидаторе. (код ниже)

Свойство объекта:

@Enumerated( EnumType.STRING )
@Column( name = "seeded_flag" )
private BaseYesNo seededFlag;

public BaseYesNo getSeededFlag() {
    return this.seededFlag;
}

public void setSeededFlag( BaseYesNo seededFlag ) {
    this.seededFlag = seededFlag;
}

И определение типа enum:

public enum BaseYesNo {
    YES( "Y" ),
    NO( "N" );

    private String yesNoVal;

    private static Map< String, BaseYesNo > stringToEnum = new HashMap< String, BaseYesNo >();

    static {
            for ( BaseYesNo byn : BaseYesNo.values() ) {
            BaseYesNo.stringToEnum.put( byn.toString(), byn );
        }
    }

    BaseYesNo( String yesNoVal ) {
        this.yesNoVal = yesNoVal;
    }

    public static BaseYesNo fromString( String dbValue ) {
        return BaseYesNo.stringToEnum.get( dbValue );
    }

    @Override
    public String toString() {
        return this.yesNoVal;
    }
}

Ответы [ 3 ]

41 голосов
/ 15 марта 2012

У меня была такая же ошибка, как и у вас. Проблема с моим состояла в том, что я ошибочно поместил @Size в мое свойство enum:

public class PhoneNumber {
  @Size(max=30) //ERROR: this validation annotation is what caused my error
  @Nonnull
  @Enumerated(EnumType.STRING)
  private Type type;
  @Size(max = 30)
  @Nonnull
  private String number;

  public enum Type {
    Cell, Home, Work, Other
  }
}

Как только я удалил ошибочную @Size, моя ошибка исчезла.

@Enumerated не доставило мне проблем, и я сомневаюсь, что @Column. Возможно, у вас была другая аннотация проверки, которую вы просмотрели, как и я.

Для тестирования я использовал hibernate-validator-4.1.0-Final.jar

1 голос
/ 23 июня 2016

Я столкнулся с такой же ситуацией, но с сообщением Не удалось найти валидатор для типа int. При поиске в Интернете я нашел несколько решений, большинство из которых сосредоточены на изменении типа int на тип Integer, потому что тип Integer принимает нули. как здесь: Проверка - пустое поле int

к сожалению, это не сработало для меня. но когда я заменил @size на @Min и @Max, все прошло отлично. в надежде, что это поможет вам.

0 голосов
/ 29 августа 2015

У меня была та же ошибка, что и у вас, но сообщение было "Не удалось найти валидатор для типа: java.lang.Long. Я потратил много времени на просмотр кода, пока не увидел предыдущее решение, и поэтому я удалил все @Size записей из кода объекта, а также проблема ушла.Я должен на самом деле выяснить, какая строка нарушает исходный код объекта, но пришел с другой более дружественной для разработчиков платформы (IBM i Series) I подождем, пока сообщения об ошибках не будут улучшены, чтобы дать нам лучшие и точные причины.

...