2017-11-29 6 views
0

나는 데이터베이스를 쿼리 나머지 서비스 다음 한는 HashMap을 포함에 응답을 얻을, 여러 "채팅"-objects 구성하고 배열로를 반환REST 개체

@GET 
@Path("/getChats") 
@Produces(MediaType.APPLICATION_JSON) 
public Chat[] getChats(@QueryParam("userId") String userId){ 

    ArrayList<Chat> chats = getChatsDB(userId); 
    Chat[] chatAr = new Chat[chats.size()]; 
    return chats.toArray(chatAr); 
} 

- 클래스가있다 "채팅" POJO :이 채팅 객체를 얻기위한 클라이언트 코드는

import java.util.HashMap; 
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 


@JsonIgnoreProperties(ignoreUnknown = true) 
public class Chat { 
private String userId1; 
private String userId2; 
private HashMap<String, String> msgs; 

public Chat() { 
    msgs = new HashMap<>(); 
} 

public String getUserId1() { 
    return userId1; 
} 

public void setUserId1(String userId1) { 
    this.userId1 = userId1; 
} 

public String getUserId2() { 
    return userId2; 
} 

public void setUserId2(String userId2) { 
    this.userId2 = userId2; 
} 
public void addMsg(String date, String msg){ 
    msgs.put(date, msg); 
} 

public HashMap<String, String> getMsgs() { 
    return msgs; 
}  
} 

입니다

:

public static Chat[] getChats() { 
    Chat[] chats = null; 
    RestTemplate restTemplate = new RestTemplate(); 
    restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter()); 
    String chatUrl = url+"getChats?userId="+user.getId(); 
    chats = restTemplate.getForObject(chatUrl, Chat[].class); 
    for(Chat c: chats){ 
     System.out.println(c.getUserId1()); 
     System.out.println(c.getUserId2()); 
     for(Map.Entry<String,String> e : c.getMsgs().entrySet()){ 
      System.out.println(e.getKey() + e.getValue()); 
     } 
    } 
    return chats; 

클라이언트가를 받으면에 채팅 개체,하지만 HashMap없이 메시지. c.getUserId1 및 c.getUserId2는 올바른 값을 반환하지만 HashMap은 비어 있습니다. 이 문제는 클라이언트 측에서만 발생합니다. servicemethod getChats (@QueryParam ("userId") String userId)의 chat-objects는 HashMap에 올바른 값을 가지고 있습니다.

[{ "USERID1": "414", "USERID2": "12"}]

답변

1

당신은 모두 게터이 필요 브라우저에서 링크 열기

이 보여 내부지도에 POJO에 세터이 있어야합니다. 어떤 이유로 how to specify jackson to only use fields - preferably globally


: 당신이 어떤 이유로 POJO 구현을 변경하지 않으려면

public class Chat { 
    private HashMap<String, String> msgs; 

    public void setMsgs(HashMap<String, String> msgs) { 
     this.msgs = msgs; 
    }  

    // rest of the code ... 
} 

, 당신은 설치 잭슨은 민간 분야가 아닌 게터/세터,이 같은 것을 사용하는 수

: 당신의 서버 측 당신에게

"maps":{"entry":[{"key":"key1","value":"value1"}]} 
instead of 
"maps":{"key1":"value1","key2":"value2"} 
당신은 아마이 같은 단지 클라이언트 측 POJO의 변화를 해결할 수

를 전송

public void setMsgs(Map<String, List<Map<String,String>>> entries){ 
    for (Map<String, String> entry: entries.get("entry")) 
     msgs.put(entry.get("key"),entry.get("value")); 
} 
+0

위대한 메시지로 유효한 json 파일을 생성합니다. 그러나 클라이언트는 예외를 던졌습니다 : org.springframework.http.converter.HttpMessageNotReadableException : JSON을 읽을 수 없습니다 : START_ARRAY 토큰 에서 java.lang.String의 인스턴스를 deserialize 할 수 없습니다 [출처 : com.android.tools.profiler .support.network.HttpTracker $ InputStreamTracker @ 69c117a; 라인 : 1, 컬럼 : 11] (참조 체인을 통해 : Chat [ "msgs"]); 중첩 예외는 com.fasterxml.jackson.databind.JsonMappingException입니다 : START_ARRAY 토큰 '에서 java.lang.String 인스턴스를 deserialize 할 수 없습니다. – cyden

+0

@cyden 업데이트 된 json을 표시 할 수 있습니까? – varren

+0

https://api.myjson.com/bins/13ppkr – cyden