2012-06-26 34 views
3

我在我的项目中使用了javax.validation API,并且在某些开发人员计算机和测试服务器上存在标题问题。在其他开发人员机器上,尽管我们使用的是由Maven处理的相同Glassfish版本,IDE和库堆栈,但无法再现此错误。找不到可用于类型的验证程序:java.lang.Object

在调试这个问题,我们猜测这可能是问题的原因(不能编译的类里面调试,因此“疑似”) - 我们有一个接口,用于我们的持久化的实体:

public interface PersistableEntity<T> { 

    public T getId(); 

    public void setId(T id); 
} 

实现类按'id'字段类型拆分:StringBigDecimal@Pattern约束连接到PersistableEntity<String>实现中id字段的获取方。

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

更新 我们决定从JSR303移动到自定义配置的验证机制。如果有问题的人发现它是解决方案,请让我知道它是哪一个,我会将其标记为答案(欢迎来自经验丰富的SO用户的任何其他解决方案以避免这种困境)。

+0

贵国是否能实现这个PersistableEntity接口的实体? ([SSCCE(http://sscce.org/)) – sp00m

+0

@ sp00m,我们有持久化的实体大层次树,并在年底有比较大的POJO类,这将是很难在这里一一列举下来的。 –

回答

0

我通常使用Spring Data的Persistable接口,但这个想法似乎与你的习惯一样。

比方说,我user表有两个字段:user_id(PK)和email(NN)。然后JAVA User实体将有一个getUserId()获取者和一个getEmail()之一。

当实现Persistable接口,getId()吸气剂必须重写,而表user不包含id字段。你可以明确地告诉JAVA对应的表不使用@Transient注释包含这样一个字段:

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

} 

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

+0

现在这个问题已经过时了,但无论如何谢谢:)我认为其他人有同样的问题会发现你的答案有帮助。 –

相关问题