我正在尝试使用Spring Boot构建一个为运动生成记分板的应用程序。以下是我的实体:
@XmlRootElement (name = "Player")
public class Player{
private String firstName;
private String lastName;
@XmlElement(required = true)
private Team team;
//All the constructors and getter setter
}
@XmlRootElement
public class Team{
private String name;
@XmlElement(required=true)
private List<Player> players;
//All the constructor and getter setter
}
以下是控制器
玩家控制器:
@RestController
public class PlayerController {
@Autowired
PlayerService service;
@RequestMapping(method = RequestMethod.GET, value = "/players")
@ResponseBody
public ResponseEntity<List<Player>> getAllPlayers(){
List<Player> players = service.getAllPlayers();
HttpHeaders responseHeaders = new HttpHeaders();
List<MediaType> medias = new ArrayList<MediaType>();
medias.add(MediaType.ALL);
return new ResponseEntity<List<Player>>(players, responseHeaders, HttpStatus.OK);
}
@RequestMapping(method = RequestMethod.POST, value ="/player/{team}")
@ResponseBody
public ResponseEntity<Player> addPlayer(@RequestBody Player player, @PathVariable("team") String teamName){
System.out.println("Inside PlayerController: "+player.getLastName());
Player p = service.addPlayer(player, teamName);
HttpHeaders responseHeaders = new HttpHeaders();
List<MediaType> medias = new ArrayList<MediaType>();
medias.add(MediaType.ALL);
responseHeaders.setAccept(medias);
return new ResponseEntity<Player>(p, responseHeaders, HttpStatus.OK);
}
}
团队控制员:
@RestController
public class TeamController {
@Autowired
private TeamService service;
@RequestMapping(method = RequestMethod.GET, value = "/teams")
@ResponseBody
public ResponseEntity<List<Team>> getAllTeams(){
List<Team> teams = service.getAllTeams();
HttpHeaders responseHeaders = new HttpHeaders();
List<MediaType> medias = new ArrayList<MediaType>();
medias.add(MediaType.ALL);
return new ResponseEntity<List<Team>>(teams, responseHeaders, HttpStatus.OK);
}
@RequestMapping(method = RequestMethod.GET, value = "team/{name}")
@ResponseBody
public ResponseEntity<Team> getOneTeamByName(@PathVariable String name){
Team t = service.getOneTeamByName(name);
HttpHeaders responseHeaders = new HttpHeaders();
List<MediaType> medias = new ArrayList<MediaType>();
medias.add(MediaType.ALL);
return new ResponseEntity<Team>(t, responseHeaders, HttpStatus.OK);
}
@RequestMapping(method = RequestMethod.POST, value = "/team")
@ResponseBody
public ResponseEntity<Team> addTeam(@RequestBody Team team){
System.out.println("New team name : "+team.getName());
Team t = service.addTeam(team);
return new ResponseEntity<Team>(t, HttpStatus.OK);
}
}
我正在使用Postman应用程序测试REST API。我发起团队在&#34; http://localhost:8090/team&#34;:
上发布以下JSON数据{"name" : "TeamA"}
现在,当我在网址上发布一个带有以下JSON的玩家&#34; http://localhost:8090/player/TeamA&#34;
{"firstName" : "TeamA", "lastName" : "Player1"}
我在邮递员身上看到的反应很奇怪。在选择JSON时,它说: 期待&#39;,&#39;而不是&#39;&#39; 在选择文本时,响应为:
{"id":null,"firstName":null,"lastName":null,"team":{"name":"TeamA","players":[{"id":null,"firstName":"TeamA","lastName":"Player1","team":{"name":"TeamA","players":[{"id":null,"firstName":"TeamA","lastName":"Player1","team":{"name":"TeamA"......
有什么方法可以让我以适当的格式得到回复。例如,我期待JSON响应如:
{"id":"1", "firstName":"TeamA", "lastName":"Player1"
}
由于
答案 0 :(得分:0)
这是一篇非常古老的文章,但我遇到了类似的问题,其中后向引用应用程序进入循环状态,并且出现了类似的错误。我希望包含从属对象以保留在实体的任一侧。 @JsonManagedReference
,@JsonBackReference
和@JsonIdentityInfo
没有帮助。您可以改用@JsonIgnoreProperties
。
在Team
类中
@JsonIgnoreProperties(value = {"team"})
private List<Player> players;
和Player
@JsonIgnoreProperties(value = {"players"})
private Team team;
这种方式对我非常有效。这篇http://springquay.blogspot.com/2016/01/new-approach-to-solve-json-recursive.html?m=1帖子解释了上述每个注释的优缺点。