Spring Roo OneToMany关系未在JSON中显示

时间:2013-04-24 16:56:46

标签: json hibernate spring-mvc jackson spring-roo

我正在尝试使用Hibernate,roo和JSON获得OneToMany关系。

通过添加

,我可以通过jspx页面看到父级的子级
 <field:display field="children" id="s_com_example_domain_Parent_children" object="${parent}" z="Etv5+hIcaVaq9A6jzjMOK0xoJMI="/>

到/src/main/webapp/WEB-INF/parents/show.jspx

但是,当我执行GET(type = application / json)时,我看不到它们 这是我的代码:

Parent.java:

 @RooJavaBean
 @RooToString
 @RooJpaActiveRecord
 @RooJson
 public class Parent {

private String name;

@OneToMany(cascade = CascadeType.ALL, mappedBy = "parent")
private Set<Child> children = new HashSet<Child>();
 }

Child.java

 @RooJavaBean
 @RooToString
 @RooJpaActiveRecord
 @RooJson
 public class Child {

private String name;

@ManyToOne
private Parent parent;
 }

Roo shell:

jpa setup --provider HIBERNATE --database HYPERSONIC_IN_MEMORY
entity jpa --class ~.domain.Parent 
entity jpa --class ~.domain.Child
field set --fieldName children --type ~.domain.Child --class ~.domain.Parent --mappedBy     parent --cardinality ONE_TO_MANY --notNull false 
field reference --fieldName parent --type ~.domain.Parent --cardinality MANY_TO_ONE --class ~.domain.Child --notNull false
web mvc setup
web mvc all --package ~.web
web mvc json all 

我还添加了

     <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.12</version>
    </dependency>

到我的maven项目。

如果我浏览网页(jspx)界面,我可以添加父p和子c。我可以看到孩子有一个父p,父母有子c,但这是我对JSON的GET请求的输出

 Request Url: http://localhost:8080/HibernateTest/children/1
 Request Method: GET
 {
     "id": 1,
     "name": "c",
     "parent": {
         "id": 1,
         "name": "p",
         "version": 0
     },
     "version": 0
 }

 Request Url: http://localhost:8080/HibernateTest/parents/1
 Request Method: GET
 {
     "id": 1,
     "name": "p",
     "version": 0
 }

如何让我的孩子在JSON GET请求中显示在父级下?

2 个答案:

答案 0 :(得分:2)

为了返回级联关系,你要覆盖你的Entity的toJson()方法(从你的.aj中推送它),在你父母中做这样的事情:

public String toJson() {
  return new JSONSerializer().include("*.children").serialize(this);
}

可以找到更多信息here。我认为还有一个你可以使用的注释,比如@Json或类似的东西,你可以在其中指示哪些成员在序列化中包含/排除,但我记不起它,也没有通过谷歌找到它。

答案 1 :(得分:0)

在RooJson注释上使用deepSerialize可以更深入地了解Flexjson,而不必弄乱方面:

@RooJavaBean
@RooJpaActiveRecord
@RooJson(deepSerialize = true)
public class Office {

    @NotNull
    private String name;

    @OneToMany(targetEntity = Person.class, cascade = CascadeType.ALL, mappedBy = "office")
    private Set<Person> people = new HashSet<Person>();

    @NotNull
    @ManyToOne(targetEntity = Company.class)
    private Company company;
}