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

25

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

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个回答

43
我遇到了和你一样的错误。我的问题是不小心把 @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


这种类型的问题可能会出现在 int 数据类型和使用 @Size 注释时。 - shohan

1
我遇到了相同的情况,但是出现了“找不到int类型的验证器”的信息。 在网上搜索后,我发现了一些解决方案,其中大部分都集中在将int类型更改为Integer类型,因为Integer类型可以接受null值。 就像这里所示: Validation - Empty int field 不幸的是,这对我没有起作用。 但是当我用@Min和@Max替换@size时,一切都很顺利。 希望这能帮到你。

-2
我遇到了和你一样的错误,但是错误信息是“找不到类型为java.lang.Long的验证器。我花了很多时间检查代码,直到看到之前的解决方案,然后我从实体代码中删除了所有 @Size 条目,问题也就解决了。实际上,我应该找出实体源代码中哪一行是有问题的,但是来自另一个更友好的开发平台(IBM i系列),我会等待错误消息得到改进,以便给我们更好、更准确的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接