如何在Spring Boot Rest中正确发布json对象

时间:2019-05-23 11:40:13

标签: java json spring rest spring-boot

我是Spring Boot Rest的新手,正在尝试使用post ab对象作为rest请求。但这不起作用,而且我得到的是null回报:

这是我要发布对象

public class Flight {
    private String code;
    private Route route;
    private LocalDateTime departure;
    private LocalDateTime arrival;
    //Constructor
   //Getters and Setters

}

这是 Route 类:

public class Route {
    private final Airport from;
    private final Airport to;
//Constructor
//Getters
}

这是我的机场班:

public class Airport {
    private final String code;
    private final String name;

 //Constructor
//Getters
}

这是我的控制器

@RequestMapping(value = "/testflight", method = RequestMethod.POST)
    public Flight createFlight(@RequestBody Flight inputPayload) {
        Flight response = inputPayload;
        response.setCode(inputPayload.getCode());
        response.setRoute(inputPayload.getRoute());
        response.setDeparture(inputPayload.getDeparture());
        response.setArrival(inputPayload.getArrival());
        System.out.println("Flight details are:" + "\n" + inputPayload.getCode() + "\n" + inputPayload.getRoute() + "\n" + inputPayload.getDeparture() + "\n" + inputPayload.getArrival());
        return response;
    }

这是我的 JSON

{ "flight": {
    "code" : "THY1770",
    "route": {
        "airport": [
            { "code": 1, "name": "IST" },
            { "code": 2, "name": "STG" }
        ],
    "departure" : "2014-01-01",
    "arrival" : "2014-01-01"
}
}
}

当我发布此JSON时,我就得到了:

航班详细信息为: 空值 空值 空值 空

2 个答案:

答案 0 :(得分:1)

控制器本身内部的代码可能是错误的: 复制inputPayload的引用然后在同一对象上调用setter是没有道理的:

我认为,鉴于在toString类中实现的Flight,您可以:

@PostMapping("/testflight") // this is just a better syntax than @RequestMapping
public Flight createFlight(@RequestBody Flight inputPayload) {
    System.out.println(inputPayload); // just to test yourself   
    return inputPayload;
}

现在,所有的映射都正确完成了,并且注释也按要求放置了,因此,如果它不起作用,则错误可能出在其他地方(未发布在问题中)。

答案 1 :(得分:1)

由于控制器仅部分发布(即:仅发布方法,而不发布完整的类),我将假定它是如此简单,并已注释为@RestController。

在对象和您传递的JSON有效负载之间似乎有一些差异。

生成控制器将接受的JSON的一种简单方法是在控制器中公开一个不使用参数作为输入并生成Flight作为输出的方法。然后,您可以将该输出用作模板来构建后续的JSON请求。

尝试发布以下JSON:

{
    "code" : "THY1770",
    "route": {
        "from": {
            "code": "ABC",
            "name": "My Airport 1"
        },
        "to": {
            "code": "DEF",
            "name": "My Airport 2"
        }
    }
    "departure" : null,
    "arrival" : null
}

请注意,在我的回答中,我将日期设置为null。对于这些,您必须确保接受您提供的格式。使用我在开始时介绍的技巧尝试找出一种可能的日期格式。

此外,请记住,日期是一个很难解决的问题。在您的特定情况下,您可能需要确保将日期及其时间和时区一起发送。

此外,您还可以在有空的时候使用Project Lombok来进行吸气器和吸气器。它将为您节省很多样板代码,对于getter和setter来说,这常常是意料之外的问题的源头。