使用JAXRS返回子ID

时间:2011-06-13 18:01:12

标签: java rest jaxb jax-rs

在使用@Produces时,我遇到了JAXRS / JAXB的问题,包括JSON结果中的子ID。以下是我的部分代码。由于我们使用的是Hibernate,因此我将id抽象为AbstractEntity类。

的POJO:

@XmlRootElement
public abstract class AbstractEntity implements Serializable {
    private Serializable id;

    @XmlElement(type-Object.class)
    @XmlSchemaType(name="anySimpleType")
    public final Serializable getId() {
      return this.id
    }

    public final Serializable setId(Serializable id) {
      this.id = id;
    }
}

@XmlRootElement
public class Parent extends AbstractEntity {
    private String parentName;
    private Child child;

    @XmlElement
    public String getParentName() {
       return parentName;
    }

    @XmlElement
    public Child getChild() {
       return child;
    }

}

@XmlRootElement
public class Child extends AbstractEntity {

    private String childName;

    @XmlElement
    public String getChildName() {
       return childName;
    }

}

JAXRS服务:

@Path("/parent")
public class ParentService {

    @GET
    @Path("/get/{id}")
    @Produces(MediaType.APPLICATION.JSON)
    public Parent getById(@PathParam("id") Long id) {

        Parent parent = hibernateDataController.getParentById(id);

        if (parent== null)
           throw new NotFoundException("GET: Parent" + id + " not found.");

        return parent;

     }
}

@Path("/child")
public class ChildService {

    @GET
    @Path("/get/{id}")
    @Produces(MediaType.APPLICATION.JSON)
    public Child getById(@PathParam("id") Long id) {

        Child child = hibernateDataController.getChildById(id);

        if (child == null)
           throw new NotFoundException("GET: Child " + id + " not found.");

        return child;

     }
}

(注意:没有显示更多代码,但主要部分在上面)

我的项目在Eclipse中,使用Maven,所以我启动了Jetty:mvn jetty:run

这是问题的开始。我可以使用以下方式访问孩子POJO:

http://myserver:8080/example/child/get/1返回 - >

{
    "id":{"@type":"xs:long","$":"1"},
    "childName":"Bart Simpson"
}

但是,当我访问父POJO时,不会返回子POJO的id:

http://myserver:8080/example/parent/get/1返回 - >

{
    "id":{"@type":"xs:long","$":"1"},
    "parentName":"Homer Simpson",
    "child": {
        "childName":"BartSimpson"
    }
}

请注意,不返回子项的ID,只返回childName。我正在使用的GUI团队正在使用GWT,他们要求我在JSON结果中包含任何子项的ID。

任何帮助JAXRS / JAXB返回子JSON中的ID都将非常感激。谢谢你的时间。

马特

1 个答案:

答案 0 :(得分:0)

今天早上我找到了解决丢失儿童ID的方法。它实际上不是JAXRS / JAXB问题,而是由Hibernate映射文件引起的(是的,我仍然喜欢在Hibernate的注释上使用映射文件)。

上面示例文件的Hibernate映射文件将是:

<hibernate-mapping>
    <class name="com.mycompany.Parent" table="PARENT">
    <id name="id" type="java.lang.Long">
        <column name="PARENT_ID" scale="0" />
        <generator class="native" />
    </id>
    <property name="parentName" type="java.lang.String">
        <column name="PARENT_NAME" />
    </property>
    <set name="children" inverse="true" lazy="true" table="CHILD" fetch="select">
        <key>
        <column name="CHILD_ID" />
        </key>
        <one-to-many class="com.mycompany.Child" />
    </set>
    </class>
</hibernate-mapping>

<hibernate-mapping>
    <class name="com.mycompany.Child" table="CHILD">
    <id name="id" type="java.lang.Long">
        <column name="CHILD_ID" scale="0" />
        <generator class="native" />
    </id>
    <property name="childName" type="java.lang.String">
        <column name="CHILD_NAME" />
    </property>
    <many-to-one name="parent" type="com.mycompany.Child" fetch="select">
        <column name="PARENT_ID" />
    </many-to-one>
    </class>
</hibernate-mapping>

修复是强迫Hibernate不要'懒惰加载'孩子们。我改变了:

<set name="children" inverse="true" **lazy="true"** table="CHILD" **fetch="select"**>

为:

<set name="children" inverse="true" lazy="false" table="CHILD" **fetch="join"**>

使用修改后的hibernate映射文件,ID来自JAXRS的结果:

{
    "id":{"@type":"xs:long","$":"1"},
    "parentName":"Homer Simpson",
    "child": {
        "id":{"@type":"xs:long","$":"1"},
        "childName":"BartSimpson"
    }
}

希望如果其他人遇到此问题,这会有所帮助。