使用JAXRS返回孩子ID

问题描述

| 使用@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;

     }
}
(注意:还有更多代码未显示,但主要部分在上面) 我的项目使用Maven在Eclipse中,因此我启动了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\",\"parentName\":\"Homer Simpson\",\"child\": {
        \"childName\":\"BartSimpson\"
    }
}
请注意,未返回孩子的ID,仅返回childName。我正在使用的GUI团队正在使用GWT,他们要求我在JSON结果中包括所有子代的ID。 非常感谢获得JAXRS / JAXB返回子JSON中的ID的任何帮助。谢谢你的时间。 马特     

解决方法

        今天早上,我找到了解决丢失的孩子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\"**>
使用修改后的休眠映射文件,这些ID通过JAXRS的结果得出:
{
    \"id\":{\"@type\":\"xs:long\",\"$\":\"1\"},\"parentName\":\"Homer Simpson\",\"child\": {
        \"id\":{\"@type\":\"xs:long\",\"childName\":\"BartSimpson\"
    }
}
希望这对其他人遇到的问题有所帮助。     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...