【问题标题】:Seam 2.3 RESTEasy on JBoss 7.1 @JsonIgnoreJBoss 7.1 上的 Seam 2.3 RESTEasy @JsonIgnore
【发布时间】:2013-04-07 17:31:11
【问题描述】:

如何实现在 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...

【问题讨论】:

    标签: json jboss7.x resteasy seam2


    【解决方案1】:

    @XmlType/@XmlRootElement 的默认注解模式是捕获每个字段,包括来自休眠的惰性初始化器。在您的实体中使用@XmlAccessorType(XmlAccessType.NONE),然后使用@XmlElement 单独注释字段,以便只处理必要的字段

    【讨论】:

      猜你喜欢
      • 2012-12-27
      • 1970-01-01
      • 2012-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-07
      • 2013-04-19
      • 1970-01-01
      相关资源
      最近更新 更多