web-dev-qa-db-ja.com

JPA-タイプのバリデーターが見つかりませんでした:enum

プロパティの1つに列挙型を使用するエンティティクラスがあり、エンティティを永続化しようとすると、次の例外が発生します。

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

そして列挙型の定義:

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;
    }
}
24
GreenSaguaro

私はあなたと同じエラーがありました。私の問題は、列挙型プロパティに誤って@Sizeを配置したことでした。

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を使用していました

42
pgreen2

同じ状況に遭遇しましたが、int型のバリデーターが見つかりませんというメッセージが表示されました。 Webを検索すると、いくつかの解決策が見つかりました。整数型はnullを受け入れるため、それらのほとんどはint型をInteger型に変更することに焦点を当てています。ここのように: 検証-空のintフィールド

残念ながら、それは私にはうまくいきませんでした。しかし、@ sizeを@Minと@Maxに置き換えると、すべてがうまくいきました。これがあなたに手を差し伸べることを願っています。

1
khldqr