Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JAXRS返回子ID_Java_Rest_Jaxb_Jax Rs - Fatal编程技术网

Java 使用JAXRS返回子ID

Java 使用JAXRS返回子ID,java,rest,jaxb,jax-rs,Java,Rest,Jaxb,Jax Rs,在使用@products时,我遇到了JAXRS/JAXB在JSON结果中包含子ID的问题。下面是我的部分代码。因为我们使用的是Hibernate,所以我将id抽象为一个AbstractEntity类 POJO: @XmlRootElement public abstract class AbstractEntity implements Serializable { private Serializable id; @XmlElement(type-Object.class)

在使用@products时,我遇到了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:mvnjetty:run

问题就从这里开始。我可以使用以下方式访问子POJO:

返回->

{
    "id":{"@type":"xs:long","$":"1"},
    "childName":"Bart Simpson"
}
但是,当我访问父POJO时,不会返回子POJO的id:

返回->

{
    "id":{"@type":"xs:long","$":"1"},
    "parentName":"Homer Simpson",
    "child": {
        "childName":"BartSimpson"
    }
}
请注意,不会返回子对象的ID,只返回子对象的名称。与我一起工作的GUI团队正在使用GWT,他们要求我在JSON结果中包含所有子项的ID

如果您能帮助JAXRS/JAXB在子JSON中返回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>

希望这对其他人遇到这个问题有所帮助。

今天早上我找到了丢失儿童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>

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

如果可能,您可以使您的
id
属性比
可序列化属性更具体,比如
long
,这将消除
type
(实际上是xsi:type)属性的写入。不幸的是,我们的数据模型有点“混乱”。我们的一些表使用Long for ID,其他表使用UUID。我选择Serializable,因为它涵盖了Long和UUID。我仍然需要一个DAO控制器来处理所有的表。您的
ParentService
正在返回一个
Person
。在转换到SO问题时,您的层次结构中是否还有其他级别或只是一个输入错误?Bamana-是的,剪切和粘贴错误,我很抱歉,这应该是家长,而不是个人。如果可能,您可以使您的
id
属性比
可序列化的
属性更具体,比如
long
,这将消除
类型(实际上是xsi:type)属性。不幸的是,我们的数据模型有点“混乱”。我们的一些表使用Long for ID,其他表使用UUID。我选择Serializable,因为它同时包含Long和UUID。我仍然希望一个DAO控制器来处理所有表。您的
ParentService
正在返回一个
Person
。还有其他的吗在你的层次结构中的级别,或者在转换到你的SO问题时只是一个输入错误?巴马纳-是的,剪切和粘贴错误,我很抱歉,这应该是家长,而不是个人。
<set name="children" inverse="true" lazy="false" table="CHILD" **fetch="join"**>
{
    "id":{"@type":"xs:long","$":"1"},
    "parentName":"Homer Simpson",
    "child": {
        "id":{"@type":"xs:long","$":"1"},
        "childName":"BartSimpson"
    }
}