Если вы не хотите создавать новую модель POJO
для представления JSON
на уровне REST API
, вам необходимо подготовить модель ORM
перед переходом на слой Jackson
.
Включить HibernateXModule
Вы должны начать с включения Hibernate
module , который наилучшим образом соответствует вашей Hibernate
версии. Это решает многие проблемы с lazy-loadings
и внутренними типами данных.
Двунаправленные отношения
Узнайте о параметрах , которые Jackson
имеют для решения проблемы циклов во время сериализации. Основные аннотации:
Определить правильную видимость
Вы можете определить глобальную видимость в ObjectMapper
, , как указать Джексона для использования только полей - предпочтительно глобально и настроить его, если необходимо для данного класса, используя аннотацию JsonAutoDetect .
Вид POJO
модель
Вероятно, в большинстве случаев вы сможете повторно использовать POJO
модель, созданную для ORM
. В случаях, когда настройка вывода JSON
с аннотацией будет сложной, вы всегда можете создать собственный класс и сопоставить модель ORM
с этой моделью вручную на дополнительном уровне отображения / бизнес-уровне.
Настройка сериализаторов
Если вам нужно обрабатывать некоторые пользовательские аннотации или некоторые поля в общем виде, вы можете использовать BeanSerializerModifier и BeanPropertyWriter . Это нелегко реализовать, но это очень мощно. Пример использования здесь: Пользовательская сериализация и десериализация Джексона .
Простой пример того, как это можно сделать для двунаправленных отношений и настройки видимости:
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.util.Arrays;
import java.util.List;
public class JsonApp {
public static void main(String[] args) throws Exception {
File jsonFile = new File("./resource/test.json").getAbsoluteFile();
Item item0 = new Item();
item0.setId(1);
item0.setItemName("Item 0");
Item item1 = new Item();
item1.setId(2);
item1.setItemName("Item 1");
List<Item> items = Arrays.asList(item0, item1);
User user = new User();
user.setId(123);
user.setName("Rick");
user.setUserItems(items);
items.forEach(item -> item.setOwner(user));
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(mapper.getSerializationConfig().getDefaultVisibilityChecker()
.withFieldVisibility(JsonAutoDetect.Visibility.ANY)
.withGetterVisibility(JsonAutoDetect.Visibility.NONE)
.withSetterVisibility(JsonAutoDetect.Visibility.NONE)
.withCreatorVisibility(JsonAutoDetect.Visibility.NONE));
System.out.println(mapper.writeValueAsString(user));
}
}
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
class User {
private int id;
private String name;
private List<Item> userItems;
// getters, setters
}
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
class Item {
private int id;
private String itemName;
private User owner;
// getters, setters
}
Над отпечатками кодов:
{"id":123,"name":"Rick","userItems":[{"id":1,"itemName":"Item 0","owner":123},{"id":2,"itemName":"Item 1","owner":123}]}