1

我的 REST 服务有问题。问题是我的实体之间有关系,当这个实体将被写为 JSON 时,JBoss 不能这样做。这是代码:

儿童班:

  @XmlRootElement
  class Child implements Serializable {
    private static final long serialVersionUID = -6058827989172575778L;
    private String childName;
    private Parent parent;
    public String getChildName() {
      return childName;
    }
    public void setChildName(String childName) {
      this.childName = childName;
    }
    public Parent getParent() {
      return parent;
    }
    public void setParent(Parent parent) {
      this.parent = parent;
    }
  }

家长班:

  @XmlRootElement
  class Parent implements Serializable {
    private static final long serialVersionUID = -8280071521315889541L;
    private String parentName;
    private List<Child> childs = new ArrayList<Child>();

    public String getParentName() {
      return parentName;
    }
    public void setParentName(String parentName) {
      this.parentName = parentName;
    }
    public List<Child> getChilds() {
      return childs;
    }
    public void setChilds(List<Child> childs) {
      this.childs = childs;
    }
  }

休息方法

  @GET
  @Path("/test")
  @Produces("application/json")
  public Response test() {
    final Parent parent = new Parent();
    parent.setParentName("Parent name");

    Child child = new Child();
    child.setChildName("Child name");
    child.setParent(parent);

    parent.getChilds().add(child);
    ResponseBuilder rb = Response.ok(parent);
    return rb.build();
  }

JBoss 生成这个损坏的 JSON:

{"parentName":"Parent name","childs":[{"childName":"Child name","parent":{"parentName":"Parent name","childs":[{"childName":"Child name","parent":{"parentName":"Parent name","childs":[{"childName":"Child name","parent":{"parentName":"Parent name","childs":[{"childName":"Child name","parent":{"parentName":"Parent name","childs":[{"childName":"Child name","parent":{"parentName":"Parent name","childs":[{"childName":"Child name","parent":{"parentName":"Parent name","childs":[{"childName":"Child name","parent":{"parentName":"Parent name","childs":[{"childName":"Child name","parent":{"parentName":"Parent name","childs":[{"childName":"Child name","parent":{"parentName":"Parent name","childs":[{"childName":"Child name","parent":{"parentName":"Parent name","childs":[{"childName":"Child name","parent":{"parentName":"Parent name","childs":[{"childName":"Child name","parent":{"parentName":"Parent name","childs":[{"childName":"Child name","parent":{"parentName":"Parent name","childs":[{"childName":"Child name","parent":{"parentName":"Parent name","childs":[{"childName":"Child name","parent":{"parentName":"Parent name","childs":[{"childName":"Child name","parent":

我怎样才能忽略孩子上的“父母”字段?有没有办法在不重写我的实体的情况下做到这一点,例如“自定义作家”或类似的东西?

4

1 回答 1

1

好吧,@damo 帮助我找到了正确的方向。当我使用 JBoss 时,我查看了 JBoss 在内部使用什么 API 来处理 JAX-RS。

我发现 JBoss 7.1.1.Final 使用 RESTeasy 2.3.2.Final,因此,它在内部使用 jackson-jaxrs 版本 1.9.2。

通过了解这一点,我导入了我的应用程序中提供的那些库并使用了@JsonIgnore注释,因为@XmlTransient当您提供 XML 但 API 会在您生成 JSON 时忽略。

如果您使用 JBoss 7.1.1.Final 并使用 maven,只需将其添加到您的依赖项中:

    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-jaxrs</artifactId>
        <version>1.9.2</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-jaxrs</artifactId>
        <version>2.3.2.Final</version>
        <scope>provided</scope>
    </dependency>

我的 Child 类的结果是这样的:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = { "childName" })
class Child implements Serializable {
  private static final long serialVersionUID = -6058827989172575778L;
  private String childName;
  @XmlTransient
  @JsonIgnore
  private Parent parent;
  public String getChildName() {
    return childName;
  }
  public void setChildName(String childName) {
    this.childName = childName;
  }
  public Parent getParent() {
    return parent;
  }
  public void setParent(Parent parent) {
    this.parent = parent;
  }
}
于 2013-08-09T03:23:48.370 回答