1

JSON 出力 (XML 出力の XmlTransient など) で一部のプロパティが無視されるようにするにはどうすればよいですか?

@GET
@Path("/{companyId}")   
@Produces(MediaType.APPLICATION_JSON)
public PortfolioCompany getCompany(@PathParam("companyId") long id);

JBoss 7.1 で EAR としてデプロイされた Seam 2.3 の RESTeasy サポートをいじってみました。Seam-restbay-example と同じ依存関係を ejb-project に追加することから始めました。一部の LazyInitialisationExceptions を防ぐために、@XmlTransient で注釈が付けられたすべてのプロパティが無視される @Produces(MediaType.APPLICATION_XML) では、基本的に正常に動作しています。しかし、 @Produces(MediaType.APPLICATION_JSON) でこの動作を実現するにはどうすればよいですか?

Seam はデフォルトで Jettison を使用し、XML と JSON の両方に @XmlTransient アノテーションを使用することを読みました (技術的には XML から JSON に変換されるため)。しかし、「Caused by: org.codehaus.jackson.map.JsonMappingException: No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer」というメッセージが表示され、実際には Jackson を使用していることがわかります..? Jackson の場合、@JsonIgnore のような注釈がありますが、restbay と同じ Maven 依存関係があります。これは「型に解決できません」。

/**
 * @return the contact
 */
@OneToOne(cascade=CascadeType.ALL,fetch=FetchType.LAZY)
@XmlTransient  // working for produces XML but not for JSON
//@JsonIgnore  = unknown type
public Contact getContact() {
return contact;
}

それについての経験やヒントはありますか?

ありがとう

編集: Seam を使用して REST サービスの遅延コレクションを実現する必要がある人は本当にいないのでしょうか??

いくつかの調査の後:

@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property ="@id")

明らかに必要なものです。ただし、これは Jackson 2.x でのみ提供されます。しかし、seam2.3/jboss7 セットアップは明らかに Jackson 1.9 を使用しています...

4

1 に答える 1

0

@XmlType/@XmlRootElement のデフォルトの注釈モードは、hibernate からの遅延初期化子を含むすべてのフィールドをキャプチャすることです。エンティティで @XmlAccessorType(XmlAccessType.NONE) を使用し、必要なフィールドのみが処理されるように @XmlElement でフィールドに個別に注釈を付けます。

于 2013-11-25T16:01:35.843 に答える