在我的控制器中,我具有以下方法:
@RequestMapping(value = "/getAll", method = RequestMethod.GET)
public List<Topic> getAllTopics() {
List<Topic> allTopics = service.getAllTopics();
assert allTopics.size() > 0; // is not empty
System.out.println(allTopics.get(0)); // Topic{id=1, name='bla', description='blahhh'}
return allTopics;
}
当我转到http://localhost:8080/getAll
时得到的结果是[{},{},{},{}]
,但是service.getAllTopics()
返回了非空列表。因此,要发送的列表不为空,但浏览器接收到无效的JSON。但是,由于以下方法返回有效的JSON,因此序列化对象没有问题。有什么问题吗?
@GetMapping("/json")
public List<Locale> getLocales() {
return Arrays.asList(DateFormat.getAvailableLocales());
}
我正在运行最新的Spring Boot,即2.1.3.RELEASE。
更新 这是我的实体课程-主题
@Entity
@Table(name = "topic", schema="tetra")
public class Topic {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
private String description;
public Topic() {
}
public Topic(String name, String description) {
this.name = name;
this.description = description;
}
@Override
public String toString() {
return "Topic{" +
"id=" + id +
", name='" + name + '\'' +
", description='" + description + '\'' +
'}';
}
}
答案 0 :(得分:1)
默认情况下,Jackson只会将公共字段和公共获取程序序列化为JSON。由于Topic
既没有公共字段也没有公共getter,因此不会序列化任何内容,并且您会得到一个空的JSON对象。
有很多方法可以配置它,例如:
(1)只需为所有字段添加公共getter
(2)使用@JsonAutoDetect(fieldVisibility = Visibility.ANY)
以便也可以自动检测私有字段:
@Entity
@Table(name = "topic", schema="tetra")
@JsonAutoDetect(fieldVisibility = Visibility.ANY)
public class Topic {
}
(3)使用@JsonProperty
明确选择要序列化的字段/获取器。这种方法的优点是JSON中的字段名称可以不同于POJO:
@Entity
@Table(name = "topic", schema="tetra")
public class Topic {
@JsonProperty("id")
private Integer id;
@JsonProperty("name")
private String name;
@JsonProperty("description")
private String description;
}