【问题标题】:JPA - No validator could be found for type: enumJPA - 找不到类型的验证器:枚举
【发布时间】:2011-08-04 06:30:26
【问题描述】:

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

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

【问题讨论】:

    标签: java jpa bean-validation


    【解决方案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

    【讨论】:

    • 这种类型的问题可能是int数据类型,使用了@Size注解。
    【解决方案2】:

    我遇到了同样的情况,但是消息 No validator can be found for type int. 在网上搜索我找到了一些解决方案,其中大多数都专注于将 int 类型更改为 Integer 类型,因为 Integer 类型接受空值。 就像在这里: Validation - Empty int field

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

    【讨论】:

      【解决方案3】:

      我遇到了与您相同的错误,但消息是“找不到类型的验证器:java.lang.Long。我花了很多时间查看代码,直到看到之前的解决方案,因此,我删除了all @Size 实体代码中的条目,问题也消失了。我实际上应该找出实体源代码中的违规行,但来自另一个对开发人员更友好的平台(IBM i 系列)我会等到错误消息得到改进后再给我们更好更准确的理由。

      【讨论】:

        猜你喜欢
        • 2020-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-02
        • 2019-09-19
        • 1970-01-01
        • 2014-02-06
        • 2015-01-02
        相关资源
        最近更新 更多