【问题标题】:No validator could be found for type: java.lang.Object找不到类型的验证器:java.lang.Object
【发布时间】:2012-06-26 04:25:52
【问题描述】:

我在我的项目中使用javax.validation API,并且在一些开发人员机器和测试服务器上遇到了名义上的问题。尽管我们使用的是由 maven 处理的相同 Glassfish 版本、IDE 和库堆栈,但在其他开发人员机器上无法重现此错误。

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

public interface PersistableEntity<T> {

    public T getId();

    public void setId(T id);
}

实现类按“id”字段类型划分:String 或 BigDecimal。 @Pattern 约束附加到 PersistableEntity&lt;String&gt; 实现中的 id 字段的 getter。

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

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

【问题讨论】:

  • 你能提供一个实体来实现这个 PersistableEntity 接口吗? (SSCCE)
  • @sp00m,我们有很大的可持久化实体的层次树,最后还有比较大的 POJO 类,这里很难一一列举。

标签: java validation generics


【解决方案1】:

我平时用的是Spring Data的Persistable接口,不过思路好像和你自定义的一样。

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

在实现Persistable 接口时,必须覆盖getId() getter,而表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;
    }

}

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

【讨论】:

  • 这个问题现在已经过时了,但无论如何谢谢你:) 我认为其他有同样问题的人会发现你的回答很有帮助。
猜你喜欢
  • 1970-01-01
  • 2014-02-06
  • 2015-01-02
  • 2016-04-16
  • 1970-01-01
  • 1970-01-01
  • 2013-05-09
  • 2011-08-24
  • 2013-06-09
相关资源
最近更新 更多