JPA - 找不到类型为enum的验证器

时间:2011-08-04 06:30:27

标签: java jpa bean-validation

我有一个实体类,它对其中一个属性使用枚举类型,当我尝试持久保存实体时,我收到以下异常:

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

3 个答案:

答案 0 :(得分:41)

我和你有同样的错误。我的问题是我错误地将@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

答案 1 :(得分:1)

我遇到了相同的情况,但是消息中找不到类型为int的验证器。 在网上搜索我发现了一些解决方案,其中大多数都专注于将类型int更改为Integer类型,因为类型Integer接受空值。 喜欢在这里: Validation - Empty int field

不幸的是,这对我不起作用。 但当我用@Min和@Max取代@size时,一切都很顺利。 希望这可以帮助你。

答案 2 :(得分:-2)

我遇到了和你一样的错误,但消息是&#34;找不到类型为:java.lang.Long的验证器。我花了很多时间来审查代码,直到我看到之前的解决方案,因此,我从实体代码中删除了所有 @Size条目,问题就消失了。我实际上应该找出实体源代码中哪一行是违规的,但是来自另一个更开发人员友好的平台(IBM i系列)我会等到错误消息得到改进,以便给出更好和准确的理由。