我正在项目中使用javax.validation
API,并且在某些开发人员计算机和测试服务器上存在名义上的问题。在其他开发人员机器上,尽管我们使用的是由maven处理的相同Glassfish版本,IDE和库堆栈,但这个错误无法再现。
在调试这个问题时,我们怀疑可能是问题的原因(我们无法在编译的类中调试,因此'怀疑') - 我们有一个可持久实体的接口:
public interface PersistableEntity<T> {
public T getId();
public void setId(T id);
}
实施类按“id”字段类型拆分:String
或BigDecimal
。 @Pattern
约束附加到id
实施中PersistableEntity<String>
字段的getter。
如果这是原因,是否可以使用javax.validation
维护验证并同时使用泛型?
更新 我们决定从JSR303转向自定义可配置验证机制。如果某个有名义问题的人发现它的解决方案,请告诉我它是哪一个,我会将其标记为答案(欢迎有经验的SO用户对此困境的任何其他解决方案)。
答案 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;
}
}
也许这可以解决您的问题。