如何解决使用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\"
}
}
希望这对其他人遇到的问题有所帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。