我的第一个RESTful Web服务出了问题

时间:2013-03-04 10:30:25

标签: web-services rest java-ee-6

我正在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;

  }

这是我的webServices

@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);
 }
}

最后我配置了Jersey

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

}

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

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

1 个答案:

答案 0 :(得分:2)

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

MyEntity持有对EntityB的引用,EntityB包含一个可以追溯到MyEntity的引用。

编组将试图编组MyEntity&gt;实体B&gt; MyEntity&gt; EntityB等等。

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

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