Укажите выходные атрибуты для сгенерированного 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 ответ
Вы можете сделать это одним из двух способов:
- Напишите методы получения в ваших моделях и используйте Джексона для генерации JSON, а не полагайтесь на встроенный механизм.
- Используйте представления 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"
}
]
}
]
Я надеюсь, что это помогает