2013-08-01 2 views
2

У меня есть два класса События и пользователи, у которых есть много разных отношений.Jackson2 many to many deserialization

public class Event { 

    private int id; 

    private List<Users> users; 
} 

public class User { 
     private int id; 

     private List<Event> events; 
} 

Я прочитал @JsonIdentityInfo аннотации должен помочь, но я не могу видеть пример этого.

ответ

5

Вы можете использовать @JsonIdentityInfo в двух классах User и Event таким образом:

import java.util.List; 

import com.fasterxml.jackson.annotation.JsonIdentityInfo; 
import com.fasterxml.jackson.annotation.ObjectIdGenerators; 

@JsonIdentityInfo(generator = ObjectIdGenerators.UUIDGenerator.class, property="@UUID") 
public class User 
{ 
    private int id; 
    private List<Event> events; 

    // Getters and setters 
} 

... и

import java.util.List; 

import com.fasterxml.jackson.annotation.JsonIdentityInfo; 
import com.fasterxml.jackson.annotation.ObjectIdGenerators; 

@JsonIdentityInfo(generator = ObjectIdGenerators.UUIDGenerator.class, property="@UUID") 
public class Event 
{ 
    private int id; 
    private List<User> users; 

    // Getters and setters 
} 

Вы можете использовать любой из ObjectIdGenerator s в зависимости от обстоятельств. Теперь, сериализация и десериализации объектов, которые соответствуют многим для многих отображения преуспеют:

public static void main(String[] args) throws IOException 
{ 
    ObjectMapper objectMapper = new ObjectMapper(); 
    objectMapper.configure(SerializationFeature.INDENT_OUTPUT, true); 

    Event event1 = new Event(); 
    event1.setId(1); 
    Event event2 = new Event(); 
    event2.setId(2); 

    User user = new User(); 
    user.setId(10); 

    event1.setUsers(Arrays.asList(user)); 
    event2.setUsers(Arrays.asList(user)); 
    user.setEvents(Arrays.asList(event1, event2)); 

    String json = objectMapper.writeValueAsString(user); 
    System.out.println(json); 

    User deserializedUser = objectMapper.readValue(json, User.class); 
    System.out.println(deserializedUser); 
} 

Надеется, что это помогает.

+0

Спасибо. Проблема, с которой я сталкиваюсь, заключается в том, что я получаю строку из вызова REST API. Пользовательский объект выглядит примерно так: {"_ id": "51f1f8acf3ce41b062000005", "events": [{"_id": "51f1fccef3ce41b062000007", "users": [{"_id": "51f1f8acf3ce41b062000005"}],}]}. запрос возвращает текущего пользователя, список событий и пользователей на мероприятии. Я использовал ObjectIdGenerators.PropertyGenerator.class, свойство = "_ id", который работает. Но поскольку пользовательский объект _id повторяется в массиве событий, я получаю исключение. У меня уже был POJO для id через цепочку ссылок: models.User ["events"] -> models.Event ["users"] -> models.User ["_ id "] – rOrlig

+0

Хм. Образцы кода в моем ответе должны идеально работать нормально. Но если вы столкнулись с проблемами с свойством ID, вы можете попробовать использовать разные значения 'property' в аннотации' @ JsonIdentityInfo' в 'User.java' и' Event.java' (например, 'property =" userId "и 'property =" eventId "' соответственно). – Jackall

1

Попробуйте использовать свойство "Scope", внутри JsonIdentityInfo аннотацию:

@JsonIdentityInfo(
    generator = ObjectIdGenerators.UUIDGenerator.class, 
    property="@UUID", 
    scope=YourPojo.class 
) 
0

Я приехал сюда "прибегая к помощи", так что я в конечном итоге с помощью @ anwers Jackall, в с небольшой мод

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") 

Это связано с тем, что у моего DTO есть свойство, называемое «id», например Event и User classes.