当请求主体具有将自定义对象作为键的Map时,415不受支持的对象异常

时间:2015-10-10 19:43:35

标签: java json spring rest spring-mvc

我的请求体是GameTeamRequest,如下所示:

public class GameTeamRequest {
    private Game game;  
    private HashMap<Team, Integer> teamsInnigsPostionMap;
}

游戏对象和团队对象如下:

public class Game{  
    private String tournamentName;
}

团队对象

public class Team{
    private String teamName;
}

控制器具有以下代码:

@RequestMapping(value = "/game", method = RequestMethod.POST)
@ResponseBody
public void createGame(@RequestBody GameTeamRequest gameTeamReq) {
    tournamentService.createGame(gameTeamReq);
}

请求有效负载如下:

{
    "game": {
        "tournamentName":"Ashes"
     },
    "teamsInnigsPostionMap" : [
    {
        "teamName":"Australia",
        "inningsPosition": "1"
    },
    {
        "teamName":"England",
        "inningsPosition": "2"
    }
  ]
}

当我尝试执行时,我得到以下异常:

415 Unsupported Media Type

当GameTeamRequest没有地图而只有对象时,这是完美的。当请求中有地图时,我错过了什么?

更新:

请求网址为http://localhost:8080/iscorecard/game

接头:

Content-Type:application / json

1 个答案:

答案 0 :(得分:1)

如果要将某些JSON反序列化为Map,那么JSON应该类似于:

{
   "key": { "valueObjectProperty": "valueObjectValue" }
}

请注意,JSON对象中的键必须是字符串,因此无法将任何对Java键的请求反序列化,其键是一些自定义对象。我的意思是你可能会写一些自定义反序列化器,但这似乎太费劲了。

最好更改Java类的格式,从而改变您发送的请求。

例如(如果团队名称是唯一的):

public class GameTeamRequest {
    private Game game;  
    private HashMap<String, Integer> teamsInnigsPostionMap;
}

然后您可以发送并成功反序列化请求,如:

{
  "game": {
     "tournamentName":"Ashes"
  },
  "teamsInnigsPostionMap" : {
    "Australia": 1,
    "England": 2
  }
}