缺少与@RequestParam变量的映射

时间:2017-06-09 08:17:06

标签: java json spring rest request-mapping

这是我的模特课:

public class RequestBody {

@JsonProperty("polygon")
private GeoPolygon geoPolygon;

@JsonProperty("domain_id")
private String domainId;

private String availability;

@JsonProperty("start_time")
private String startTime;

@JsonProperty("end_time")
private String endTime;

@JsonProperty("page_size")
private int pageSize;

private int offset;

//getters, setters, toString()

以下是我的控制器:

@RequestMapping(value = "/request", method = RequestMethod.GET, produces = "application/json")
public ResponseEntity getResponse(RequestBody request){
    // process request, return response.
}

这就是我调用API的方式:

http://localhost:9876/request?availability=TEMPORARY&start_time=2017-06-06T13:24:23Z&end_time=2017-06-05T13:24:23Z&polygon={"type":"polygon","coordinates":[[[-120,10],[-30,10],[-30,60],[-120,60],[-120,10]]]}&domain_id=XYZ&page_size=10&offset=1

现在问题:

未映射所有属性。特别是@JsonProperty注释的那些。这些字段保持为空。

我将相同的模型发送到同一端点的POST请求,并且完全正常。 @JsonProperty不支持GET吗?

2 个答案:

答案 0 :(得分:3)

在JSON序列化/反序列化期间将考虑@JsonProperty应用程序。如果提取的内容来自请求正文(又名@RequestBody Spring注释),则会发生JSON反序列化。

您的RequestBody(小心名称冲突)是从请求参数中提取的。在这种情况下,Spring不会使用JSON反序列化,而只是调用相应的Java Bean setter。

如果您希望将startTime映射到start_time,那么您的二传手必须是:

public setStart_time(String startTime) {
    this.startTime = startTime;
}

你的其他领域也一样。

答案 1 :(得分:1)

正如kagmole在回答中已经说过@RequestBodyRequestParam的JSON反序列化差异所以你可以通过在@JsonProperty名称上设置setter来消除错误。

我只想补充一点,如果您不确定将{1}}或RequestBody用于POJO,那么您的字段实际上应该有两个getter / setter。

这在接受的答案& this SO Question的其他答案。