3

私はjavax.validation自分のプロジェクトで API を使用していますが、一部の開発者マシンとテスト サーバーで問題が発生しています。他の開発者マシンでは、Maven によって処理される同じ Glassfish バージョン、IDE、およびライブラリ スタックを使用しているにもかかわらず、このバグを再現できません。

この問題をデバッグしているときに、問題の原因である可能性があるものを疑っています (コンパイルされたクラス内でデバッグできないため、「疑わしい」) - 永続化可能なエンティティのインターフェイスがあります。

public interface PersistableEntity<T> {

    public T getId();

    public void setId(T id);
}

実装クラスは、「id」フィールド タイプによって分割されます:StringまたはBigDecimal. 制約は、実装のフィールド@Patternのゲッターに添付されます。idPersistableEntity<String>

これが原因である場合、javax.validationジェネリックを使用して検証を維持し、同時に使用することは可能ですか?

更新 JSR303 からカスタム構成可能な検証メカニズムに移行することにしました。タイトルの問題を抱えている人が解決策を見つけた場合は、それがどれであるかを教えてください。回答としてマークします(経験豊富な SO ユーザーからのこのジレンマに対する他の解決策は大歓迎です)。

4

1 に答える 1

0

普段はSpring Dataのインターフェースを使っていPersistableますが、考え方はカスタムのものと同じようです。

テーブルに(PK) と(NN)のuser2 つのフィールドがあるとします。JAVAエンティティはgetter と getter を持ちます。user_idemailUsergetUserId()getEmail()

Persistableインターフェイスを実装する場合、テーブルにフィールドが含まれていないgetId()間、getter をオーバーライドする必要があります。注釈を使用して、対応するテーブルにそのようなフィールドが含まれていないことを明示的に Java に伝えることができます。userid@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;
    }

}

多分これはあなたの問題を解決するかもしれません。

于 2013-04-08T09:56:07.497 に答える