Java 将Spring JPA一对多对象编组为JSON
我试图将3个JPA对象封送到JSON字符串中。 游戏对象持有一个玩家列表,每个玩家持有一个帧列表。JPA部分似乎运行良好。但是,JSON输出是空的 Game.javaJava 将Spring JPA一对多对象编组为JSON,java,json,spring,hibernate,jackson,Java,Json,Spring,Hibernate,Jackson,我试图将3个JPA对象封送到JSON字符串中。 游戏对象持有一个玩家列表,每个玩家持有一个帧列表。JPA部分似乎运行良好。但是,JSON输出是空的 Game.java package com.bowling.bowlingapp.game; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonManagedReference; import javax.p
package com.bowling.bowlingapp.game;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
/**
* A single bowling game
*
*/
@Entity
@Table( name = "games")
public class Game {
@Id @GeneratedValue
@JsonIgnore
private Long id;
@OneToMany(cascade = CascadeType.ALL,
fetch = FetchType.LAZY,
mappedBy = "game")
@JsonManagedReference
List<Player> players;
public List<Player> getPlayers() {
return players;
}
public void setPlayers(List<Player> players) {
this.players = players;
}
public void addPlayer(Player player) {
if (this.players == null) {
players = new ArrayList<>();
}
this.players = players;
}
}
我正试图用以下代码实现它:
public String makeGame() {
Player bob = new Player("Bob");
Player joe = new Player("Joe");
Frame frameOne = new Frame();
frameOne.setScore(12);
Frame frameTwo = new Frame();
frameTwo.setScore(15);
List<Frame> frames = new ArrayList<>();
bob.setFrames(frames);
joe.setFrames(frames);
List<Player> players = new ArrayList<>();
players.add(bob);
players.add(joe);
Game game = new Game();
game.setPlayers(players);
ObjectMapper mapper = new JsonMapper();
String result = "temp";
try {
result = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(game);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return result;
}
正如你所看到的,它是空的。我做错了什么
编辑:现在我为每个私有属性添加了getter和setter,输出如下所示:
{
"players" : [
{
"frames" : [ ]
},
{ "frames" : [ ]
}
]
}
{
"players" : [ {
"name" : "Bob",
"frames" : [ ]
}, {
"name" : "Joe",
"frames" : [ ]
} ]
编辑:我忘了添加
frames.add(frameOne);框架。添加(框架二)代码>到我的生成器代码。现在它起作用了。谢谢大家! 场景后面的对象映射器使用所有属性的getter方法。
请在所有3个类中声明getter方法。现在输出具有播放器名称,但帧仍然是空列表。我为播放器对象创建帧列表的代码不完整。获得者是问题所在。非常感谢。上面缺少2行代码。frames.add(frameOne);框架。添加(框架二);
{
"players" : [
{
"frames" : [ ]
},
{ "frames" : [ ]
}
]
}
{
"players" : [ {
"name" : "Bob",
"frames" : [ ]
}, {
"name" : "Joe",
"frames" : [ ]
} ]