Укажите выходные атрибуты для сгенерированного JSON для полиморфных ассоциаций

Я связал две таблицы с их общей, используя полиморфную ассоциацию:

@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?

Вот содержимое java-класса, который я хотел бы отобразить в JSON (я опустил методы доступа):

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

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

Спасибо.

1 ответ

Вы можете сделать это одним из двух способов:

  1. Напишите методы получения в ваших моделях и используйте Джексона для генерации 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"/>]

Теперь обратите внимание. Первый и последний символы [ а также ], которые являются скобками, обозначающими массив в JSON. Содержание является частичным называется person, Это будет автоматически вызываться для каждого значения в коллекции 'people', а их содержимое будет чередоваться с частичным 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 частичное это один символ: ,,

Вы можете проверить / запустить пример сборки службы REST приложения в JavaLite / ActiveWeb: https://github.com/javalite/activeweb-rest/tree/master/src/main/webapp/WEB-INF/views/people

Если вы запустите этот пример приложения и выполните шаги, описанные в файле README, вы увидите этот 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"
      }
    ]
  }
]

Я надеюсь, что это помогает

Другие вопросы по тегам