0

RESTWebサービスAPIがあります。JPAを使用してデータベースをマッピングしました。私はエンティティ「ペルソナ」を持っています。POSTメソッドを使用して新しいエンティティを追加すると、GETメソッドも正常に機能しますが、PUTメソッドを呼び出そうとすると、デバッグ中に「null例外を抑制できません」という例外が見つかりました。および「自己抑制は許可されていません」。他のエンティティを含むテストデータベースでは、すべてが正常に機能します...追加は、私の場合の編集とほぼ同じように機能します。最初は値のみを取得し、変更後はすべて同じように実行します。唯一の違いは、使用されるメソッドPUTがあることです。 POSTの代わりに。

これは私のPUTメソッドです(ここでは例外が発生します):

 @PUT
@Consumes({"application/xml", "application/json"})
public Response edit(Persona entity) {
    try {
        getJpaController().edit(entity);
        return Response.ok().build();
    } catch (Exception ex) {
        return Response.notModified(ex.getMessage()).build();
    }
}

私は初めてWebサービスを使用しているので、初心者です。

そのような行動の理由は何でしょうか?この自己抑制エラーとは何ですか?

他にソースコードが必要な場合は、教えてください。投稿を編集します。

@編集:

JpaControllerクラスでいくつかの例外が見つかりました。私のペルソナクラスには次のものがあります。

@OneToOne(cascade = CascadeType.ALL, mappedBy = "persona")
    private Personaacceso personaacceso;

JpaControllerには次のものがあります。

Personaacceso personaaccesoOld = persistentPersona.getPersonaacceso();
            Personaacceso personaaccesoNew = persona.getPersonaacceso();

if (personaaccesoOld != null && !personaaccesoOld.equals(personaaccesoNew)) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("You must retain Personaacceso " + personaaccesoOld + " since its persona field is not nullable.");
            }

だから私はPersonaaccesoを保持しなければならないというメッセージを示しています。それを解決する方法はありますか?

4

1 に答える 1

0

さて、私は今の理由が何であったかを知っています...

各ペルソナエンティティには、他のエンティティ(1対1または1対多)がいくつかあります。Jpa Controllerは、これらの包含エンティティをすべて保持していませんでした(代わりに、新しいエンティティを作成していました)。そのため、データが失われ、そのペルソナエンティティが編集されなかったためです。

解決策:含まれているすべてのエンティティに対して、次のような操作を行います。

containedEntityNew=containedEntityOld;

ただし、これらのエンティティフィールドは古い「メイン」エンティティから書き直されていることを考慮してください。

于 2012-09-17T09:29:02.987 に答える