Java 使用JAXRS返回子ID
在使用@products时,我遇到了JAXRS/JAXB在JSON结果中包含子ID的问题。下面是我的部分代码。因为我们使用的是Hibernate,所以我将id抽象为一个AbstractEntity类 POJO: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)
@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"
}
}