我在 SO 上的第一篇文章 - 万岁!
我正在尝试使用他们的数据存储在 Google 应用引擎上创建 Java REST 服务。我已经启动并运行了该服务,并且我能够很好地存储单个实体,但是现在,我在存储具有关系的实体时遇到了麻烦。( IllegalArgumentException: out of field index :-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();
}
我将堆栈跟踪上传到: