在使用@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都将非常感激。谢谢你的时间。
马特
答案 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"
}
}
希望如果其他人遇到此问题,这会有所帮助。