"预期','而不是' ' " Spring Boot POST方法响应的消息

时间:2018-03-05 02:28:15

标签: spring-boot

我正在尝试使用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" 
}

由于

1 个答案:

答案 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帖子解释了上述每个注释的优缺点。