JPA - 找不到类型:枚举的验证器

2022-09-01 18:49:45

我有一个实体类,它使用枚举类型作为其中一个属性,当我尝试持久化实体时,我得到以下异常:

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

答案 1

我和你有同样的错误。我的问题在于我错误地将枚举属性放在我的枚举属性上:@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


答案 2

我遇到了同样的情况,但是对于消息找不到类型int的验证器,搜索网络我找到了一些解决方案,其中大多数解决方案都集中在将类型int更改为类型Integer上,因为类型Inte接受null。就像在这里:验证 - 空的int字段

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


推荐