1

如何实现在 JSON 输出中忽略某些属性(例如用于 XML 输出的 XmlTransient)?

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

我一直在玩 Seam 2.3 中的 RESTeasy-support,作为 JBoss 7.1 上的 EAR 部署。我首先将与 Seam-restbay-example 中相同的依赖项添加到我的 ejb 项目中。@Produces(MediaType.APPLICATION_XML) 基本上可以正常工作,其中所有使用 @XmlTransient 注释的属性都被忽略,以防止一些 LazyInitialisationExceptions。但是如何为@Produces(MediaType.APPLICATION_JSON) 实现这种行为?

我读过 Seam 默认使用 Jettison,它对 XML 和 JSON 都使用 @XmlTransient 注释(因为从技术上讲,它从 XML -> 转换为 JSON)。但是我得到一个“原因:org.codehaus.jackson.map.JsonMappingException:没有为类 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 的默认注解模式是捕获每个字段,包括来自休眠的惰性初始化器。在您的实体中使用 @XmlAccessorType(XmlAccessType.NONE) ,然后使用 @XmlElement 单独注释字段,以便只处理必要的字段

于 2013-11-25T16:01:35.843 回答