gpt4 book ai didi

java - REST GET 响应包含 HashMap 的对象

转载 作者:行者123 更新时间:2023-12-02 11:56:46 26 4
gpt4 key购买 nike

我有以下 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);
}

“Chat”类是 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 为空。这个问题只出现在客户端。服务方法 getChats(@QueryParam("userId") String userId) 中的聊天对象在 HashMap 中具有正确的值。

在浏览器中打开链接显示:

[{"userId1":"414","userId2":"12"}]

最佳答案

您需要在 POJO 中为内部映射提供 getter 和 setter

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

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

// rest of the code ...
}

如果您出于某种原因不想更改 pojo 实现,您可以将 Jackson 设置为使用私有(private)字段而不是 getters/setters,如下所示:how to specify jackson to only use fields - preferably globally

<小时/>

出于某种原因,您的服务器端向您发送

"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"));
}

关于java - REST GET 响应包含 HashMap 的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47556440/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com