找不到类型的验证器:java.lang.Object

时间:2012-06-26 04:25:53

标签: java validation generics

我正在项目中使用javax.validation API,并且在某些开发人员计算机和测试服务器上存在名义上的问题。在其他开发人员机器上,尽管我们使用的是由maven处理的相同Glassfish版本,IDE和库堆栈,但这个错误无法再现。

在调试这个问题时,我们怀疑可能是问题的原因(我们无法在编译的类中调试,因此'怀疑') - 我们有一个可持久实体的接口:

public interface PersistableEntity<T> {

    public T getId();

    public void setId(T id);
}

实施类按“id”字段类型拆分:StringBigDecimal@Pattern约束附加到id实施中PersistableEntity<String>字段的getter。

如果这是原因,是否可以使用javax.validation维护验证并同时使用泛型?

更新 我们决定从JSR303转向自定义可配置验证机制。如果某个有名义问题的人发现它的解决方案,请告诉我它是哪一个,我会将其标记为答案(欢迎有经验的SO用户对此困境的任何其他解决方案)。

1 个答案:

答案 0 :(得分:0)

我通常使用Spring Data的Persistable界面,但这个想法似乎与您的自定义界面相同。

假设我的user表有两个字段:user_id(PK)和email(NN)。然后,JAVA User实体将拥有getUserId()个getter和getEmail()个。

实施Persistable界面时,必须覆盖getId()获取者,而表user不包含id字段。您可以使用@Transient注释明确告诉JAVA相应的表不包含这样的字段:

@Entity
@Table(name = "user")
public class User implements Persistable<Integer> {

    // Persistable implementation

    @Override
    @Transient // <-- means "not a database field"
    public Integer getId() {
        return getUserId();
    }

    // user_id

    @Column(name = "user_id", precision = 10)
    @GeneratedValue
    @Id
    public Integer getUserId() {
        return userId;
    }

    // email

    @NotNull
    @Column(name = "email", nullable = false, unique = true)
    public String getEmail() {
        return email;
    }

}

也许这可以解决您的问题。