SO に関する私の最初の投稿 - ばんざーい!
データ ストアを使用して、Google アプリ エンジンで Java REST サービスを作成しようとしています。私はサービスを稼働させており、単一のエンティティを問題なく保存できますが、現在、関係を持つエンティティの保存に問題があります。( IllegalArgumentException: フィールド インデックス外:-1 - 以下のスタック トレースを参照)
時間をかけて掘り下げたところ、何人かの人々がデータエンハンサーを再実行することでこの問題を解決できたことがわかりました( https://groups.google.com/forum/?fromgroups=#!topic/google-appengine-java/Uc7fVnSqcL0)。エンハンサーを再実行しました。Eclipse で、それが実行中であり、クラスが拡張されていることを確認できます (おそらくエラーはありません)。残念ながら、これで問題は解決していません。
注:明らかに、Jersey は本番環境の ASM 4.0 では動作しません。ASM のバージョン 3.1 に切り替える必要がありましたが、その上、JPA 2.0 が ASM 3.1 で動作しないことがわかりました。そのため、現在は ASM 3.1 と JPA 1.0 に移行しています。このすべてについて間違っていることを教えてください。
しばらくして、インターネット上で私の問題の非常に基本的なバージョン (本と章を含む) を見つけましたが、それでも同じエラーが発生します。私の元のプロジェクトでは、KeyFactory を使用して適切な子親キーを生成しようとしましたが、同じエラーが発生しました: IllegalArgumentException: out of field index :-1
これが私のコード、スタックトレース、および私のプロジェクトワークスペースのスクリーンショットです。他にお手伝いできることがありましたらお知らせください。ありがとうございます!
import java.util.ArrayList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import com.google.appengine.api.datastore.Key;
@Entity
public class Book {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Key id;
private String title;
@OneToMany(mappedBy = "book", cascade = CascadeType.ALL)
private List<Chapter> chapters = new ArrayList<Chapter>();
public Key getId() {
return id;
}
public void setId(Key id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public List<Chapter> getChapters() {
return chapters;
}
public void setChapters(List<Chapter> chapters) {
this.chapters = chapters;
}
}
@Entity
public class Chapter {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Key id;
private String title;
private int numPages;
@ManyToOne(fetch = FetchType.LAZY)
private transient Book book;
public Key getId() {
return id;
}
public void setId(Key id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public int getNumPages() {
return numPages;
}
public void setNumPages(int numPages) {
this.numPages = numPages;
}
public Book getBook() {
return book;
}
public void setBook(Book book) {
this.book = book;
}
}
私のテスト REST サービス:
EntityManager _em = EMF.get().createEntityManager();
@GET
@Path("/ff")
@Produces(MediaType.APPLICATION_JSON)
public Response ff() {
Book b = new Book();
b.setTitle("JPA 4eva");
Chapter c1 = new Chapter();
c1.setTitle("Intro");
c1.setNumPages(10);
Chapter c2 = new Chapter();
c2.setTitle("Configuration - aa");
c2.setNumPages(9);
b.getChapters().add(c1);
b.getChapters().add(c2);
_em.getTransaction().begin();
try {
_em.persist(b);
_em.getTransaction().commit();
} finally {
if (_em.getTransaction().isActive()) {
_em.getTransaction().rollback();
}
}
Gson gson = new Gson();
return Response.ok(gson.toJson(b), MediaType.APPLICATION_JSON).build();
}
スタック トレースを次の場所にアップロードしました。