0

我使用多态关联将 2 个表链接到其公共表:

@BelongsToPolymorphic(parents = {Application.class, SiteSection.class})
public class Parameter extends Model {
    static {
        validatePresenceOf("parent_id", "parent_type");
    }
}

控制器中使用的查询是这样的:

String siteSettingsParameters = SiteSection.where("site_id=?", site.getId()).include(Parameter.class).toJson(false);

结果 JSON 包含子节点:

[
    {
        "id": 253,
        "section_id": 60,
        "site_id": 61,
        "children": {
            "parameters": [
                {
                    "created_at": "2017-12-19T15:50:28Z",
                    "id": 145,
                    "parent_id": 253,
                    "parent_type": "app.models.SiteSection",
                    "updated_at": "2017-12-19T15:50:28Z",
                    "value": "Terrible Swift Sword"
                }
            ]
        }
    },  
    {
        "id": 254,
        "section_id": 61,
        "site_id": 61,
        "children": {
            "parameters": [
                {
                    "created_at": "2017-12-19T15:50:28Z",
                    "id": 146,
                    "parent_id": 254,
                    "parent_type": "app.models.SiteSection",
                    "updated_at": "2017-12-19T15:50:28Z",
                    "value": "Sleep the Brave"
                }
            ]
        }
    },
...]

是否可以跳过Java 类中的子节点以映射到上述 JSON ?

这是我想映射 JSON 的 java 类的内容(我省略了访问器方法):

@JsonIgnoreProperties(ignoreUnknown = true)
public class SiteSectionDTO {
    private Integer id;
    private SectionDTO section;
    private SiteDTO site;

    @JsonProperty("children")
    private List<ParameterDTO> parameters;
...
accessors come here

谢谢你。

4

1 回答 1

1

您可以通过以下两种方式之一执行此操作:

  1. 在模型上编写 getter 方法,并使用 Jackson 生成 JSON,而不是依赖内置机制。
  2. 使用 ActiveWeb 视图和部分生成 JSON。

我个人选择第二种方法,因为它已经内置到框架中,并且是最灵活和可读的。

假设您需要返回人员及其地址。这是你的PeopleController#index()方法:

public void index(){
   view("people", Person.findAll().include(Address.class).orderBy("id"));
   render().contentType("application/json");
}

如您所见,我们使用一种include()方法来预缓存地址。

index.ftl视图如下所示:

[<@render partial="person" collection=people spacer="comma"/>]

现在,注意这里。第一个和最后一个字符是[and ],它们是标识 JSON 中数组的括号。内容是部分称为person. 这将自动为集合 'people' 中的每个值调用,并且它们的内容将由来自 partial 的内容交错comma

让我们看看部分的内容person

{
   "id" : ${person.id},
   "first_name" : "${person.first_name}",
   "last_name" : "${person.last_name}",
   "addresses" : [<@render partial="address" collection=person.getAddresses() spacer="comma"/> ]
}

ActiveWeb 自动有一个可用的对象,该对象以部分本身的名称命名,在本例中为person.

在这里,您可以选择要显示的属性和顺序。addresses集合使用相同的技术,只是用address集合调用部分person.getAddresses()。部分内容comma是单个字符:,.

您可以在 JavaLite/ActiveWeb 中检查/运行示例应用程序 REST 服务构建: https ://github.com/javalite/activeweb-rest/tree/master/src/main/webapp/WEB-INF/views/people

如果您运行此示例应用程序并按照自述文件中的步骤操作,您将在输出中看到此 JSON:

[
  {
    "id": 1,
    "first_name": "Marylin",
    "last_name": "Monroe",
    "addresses": [
      {
        "address_type": "residential",
        "address1": "123 Pine St",
        "address2": "Apt 3",
        "city": "Chicago",
        "state": "IL",
        "zip": "60606"
      },
      {
        "address_type": "shipping",
        "address1": "135 S LaSalle St",
        "address2": "",
        "city": "Chicago",
        "state": "IL",
        "zip": "60604"
      }
    ]
  },
  {
    "id": 2,
    "first_name": "John",
    "last_name": "Kennedy",
    "addresses": [
      {
        "address_type": "residential",
        "address1": "456 Pine St",
        "address2": "Apt 5",
        "city": "Chicago",
        "state": "IL",
        "zip": "60606"
      },
      {
        "address_type": "shipping",
        "address1": "200 N LaSalle St",
        "address2": "",
        "city": "Chicago",
        "state": "IL",
        "zip": "60604"
      }
    ]
  }
]

我希望它有帮助

于 2017-12-22T17:56:08.847 回答