3

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

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

public interface PersistableEntity<T> {

    public T getId();

    public void setId(T id);
}

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

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

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

4

1 回答 1

0

我通常使用PersistableSpring Data的接口,但想法似乎和你自定义的一样。

假设我的user表有两个字段:user_id(PK)和email(NN)。JAVAUser实体将有一个getUserId()getter 和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;
    }

}

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

于 2013-04-08T09:56:07.497 回答