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 は、 MyEntity に戻る参照を保持する EntityB への参照を保持します。

マーシャラーは、MyEntity > EntityB > MyEntity > EntityB などのマーシャリングを試みます。

これを回避するために、EntityB の MyEntity を @XmlTransient としてマークできます。

ただし、すべてのプロジェクト (永続層から通信層まで) で同じオブジェクトのクラスを使用しようとするのは得策ではないかもしれません。

于 2013-03-04T13:47:08.213 に答える