2013-08-01 2 views
2

많은 관계가있는 Events와 Users 클래스가 두 개 있습니다. 나는 주석 @JsonIdentityInfo 읽고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; 
} 

은 도움이하도록되어 있지만이의 예를 볼 수 없습니다.

답변

5

당신은 두 클래스 UserEvent이 방법으로 @JsonIdentityInfo를 사용할 수 있습니다

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의 적절한 중 하나를 사용할 수 있습니다. 이제는 many to many 매핑에 해당하는 객체의 serialization 및 deserialization이 성공합니다.

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", "사용자": [{ "_id": "51f1f8acf3ce41b062000005"}]}}}와 유사합니다. 요청은 현재 사용자, 이벤트 목록 및 이벤트에있는 사용자를 리턴합니다. ObjectIdGenerators.PropertyGenerator.class, property = "_ id"를 사용했습니다. 하지만 User 객체 _id가 이벤트 배열에서 반복되기 때문에 참조 체인을 통해 이미 id가 POJO를 가졌습니다. models.User [ "events"] -> models.Event [ "users"] -> models.User [ "_ id "] – rOrlig

+0

흠. 내 대답에 코드 샘플을 이상적으로 잘 작동합니다. 그러나 ID 속성에 문제가있는 경우,'User.java'와'Event.java'의'@JsonIdentityInfo' 주석 ('property = "userId"'및 'property = "eventId" "각각). – Jackall

1

시도는 JsonIdentityInfo 주석 내부의 "범위"속성을 사용합니다 :

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

내가 "인터넷 검색"여기 온, 그래서 나는 약간 모드

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") 
으로, Jackall의 anwers @ 사용하여 종료

이것은 내 DTO에 "id"라는 속성이 있는데, 이는 질문의 Event 및 User 클래스와 같습니다.