0

我正在 javaEE6 中开发我的第一个 RestFul webServices。这是我的实体 Bean

@XmlRootElement
@Entity
public class MyEntity implements Serializable {

 @Id
 @GeneratedValue
 private long idEntity;

 private String name;

 private String description;

 @OneToMany(mappedBy = "entity" , fetch = FetchType.EAGER)
 private List<EntityB>  list;

  //Get and set
}

 @Entity
 public class EntityB {

 @Id
 @GeneratedValue
 private long idCategoria;

 @ManyToOne
 private MyEntity myEntity;

  }

这是我的网络服务

@Path("myentity")
@Produces( {MediaType.APPLICATION_XML , MediaType.APPLICATION_JSON })
@Consumes( {MediaType.APPLICATION_XML , MediaType.APPLICATION_JSON })
@Stateless
public class MyEntityService {

 @Inject
 MyEntityDao entityDao;

 @GET
 @Path("{id}/")
 public MyEntity findById(@PathParam("id") Long id){
    return entityDao.findById(id);
 }
}

最后我配置了泽西岛

@ApplicationPath("ws")
public class ApplicationConfig extends Application {

}

现在,如果我尝试调用我的 Web 服务(localhost:8080/xxxx/ws/myentity),我会收到此错误:

HTTP 状态 500 - javax.xml.bind.MarshalException - 带有链接异常:[com.sun.istack.SAXException2:在对象图中检测到循环。这将导致无限深的 XML

4

1 回答 1

2

您有一个对象的循环图,这是不允许的,因为它会导致“无限”XML。

MyEntity 持有对 EntityB 的引用,后者持有返回 MyEntity 的引用。

编组器将尝试编组 MyEntity > EntityB > MyEntity > EntityB 等等。

您可以将 EntityB 中的 MyEntity 标记为 @XmlTransient,以避免这种情况。

但是,尝试在所有项目中使用相同的对象类(从持久层到通信层)可能不是一个好主意。

于 2013-03-04T13:47:08.213 回答