【问题标题】:Missing mappings with @RequestParam variables缺少带有 @RequestParam 变量的映射
【发布时间】:2017-06-09 08:17:06
【问题描述】:

这是我的模型类:

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 吗?

【问题讨论】:

    标签: java json spring rest request-mapping


    【解决方案1】:

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

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

    如果您希望 startTimestart_time 映射,您的 setter 必须是:

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

    其他领域也是如此。

    【讨论】:

      【解决方案2】:

      正如 kagmole 关于 @RequestBodyRequestParam 的 JSON 反序列化差异的回答中所说的那样,您可以通过对 @JsonProperty 名称执行设置器来消除错误。

      我只想补充一点,如果您不确定将 POJO 用于RequestBodyRequestParam,那么您实际上应该为您的字段设置两个 getter / setter。

      这在this SO Question 的已接受答案和其他答案中突出显示。

      【讨论】:

        猜你喜欢
        • 2012-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-25
        • 1970-01-01
        • 2018-06-20
        • 1970-01-01
        • 2017-03-12
        相关资源
        最近更新 更多