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

Java 如何在Spring Boot Rest中正确发布json对象,java,json,spring,rest,spring-boot,Java,Json,Spring,Rest,Spring Boot,我不熟悉Spring引导Rest,并尝试使用post ab对象作为Rest请求。但它不起作用,我得到了零回报: 这是我想发布的对象: public class Flight { private String code; private Route route; private LocalDateTime departure; private LocalDateTime arrival; //Constructor //Getters and Sett

我不熟悉Spring引导Rest,并尝试使用post ab对象作为Rest请求。但它不起作用,我得到了零回报:

这是我想发布的对象

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

}
@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;
    }
{ "flight": {
    "code" : "THY1770",
    "route": {
        "airport": [
            { "code": 1, "name": "IST" },
            { "code": 2, "name": "STG" }
        ],
    "departure" : "2014-01-01",
    "arrival" : "2014-01-01"
}
}
}
这是路线等级:

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
}
这是我的机场课程:

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
}
这是我的控制器

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

}
@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;
    }
{ "flight": {
    "code" : "THY1770",
    "route": {
        "airport": [
            { "code": 1, "name": "IST" },
            { "code": 2, "name": "STG" }
        ],
    "departure" : "2014-01-01",
    "arrival" : "2014-01-01"
}
}
}
这是我的JSON

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

}
@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;
    }
{ "flight": {
    "code" : "THY1770",
    "route": {
        "airport": [
            { "code": 1, "name": "IST" },
            { "code": 2, "name": "STG" }
        ],
    "departure" : "2014-01-01",
    "arrival" : "2014-01-01"
}
}
}
当我发布此JSON时,我只得到以下信息:

航班详情如下: 无效的 无效的 无效的
null

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

我认为,考虑到
Flight
类中实现的
toString
,您可以:

@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;
}

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

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

我认为,考虑到
Flight
类中实现的
toString
,您可以:

@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;
}

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

因为控制器仅部分发布(即:仅方法,而非完整类),我将假设它非常简单,并且已经被注释为@RestController

看起来,对象和传递的JSON负载之间存在一些差异

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

尝试发布以下JSON:

{
    "code" : "THY1770",
    "route": {
        "from": {
            "code": "ABC",
            "name": "My Airport 1"
        },
        "to": {
            "code": "DEF",
            "name": "My Airport 2"
        }
    }
    "departure" : null,
    "arrival" : null
}
请注意,在我的回答中,我已将日期设置为空。对于那些你必须确保你提供的格式被接受。使用我在开始时解释的技巧,尝试找出一种可能的日期格式

另外,记住日期是一个很难解决的问题。在您的特定情况下,您可能希望确保日期与其时间和时区一起发送


另外,当你有时间的时候,帮你自己做一个“龙目计划”来帮助那些能干和能干的人。它将为您节省大量样板代码,在getter和setter的情况下,这些代码常常是意外问题的根源。

由于控制器仅部分发布(即:仅发布方法,而非完整类),我将假设它与所获得的一样简单,并且已被注释为@RestController

看起来,对象和传递的JSON负载之间存在一些差异

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

尝试发布以下JSON:

{
    "code" : "THY1770",
    "route": {
        "from": {
            "code": "ABC",
            "name": "My Airport 1"
        },
        "to": {
            "code": "DEF",
            "name": "My Airport 2"
        }
    }
    "departure" : null,
    "arrival" : null
}
请注意,在我的回答中,我已将日期设置为空。对于那些你必须确保你提供的格式被接受。使用我在开始时解释的技巧,尝试找出一种可能的日期格式

另外,记住日期是一个很难解决的问题。在您的特定情况下,您可能希望确保日期与其时间和时区一起发送


另外,当你有时间的时候,帮你自己做一个“龙目计划”来帮助那些能干和能干的人。它将为您节省大量样板代码,在getter和setter的情况下,这些代码往往是意外问题的根源。

我尝试过,但得到了以下结果:Flight{code='null',route=null,department=null,arrival=null}我尝试过,但得到了以下结果:Flight{code='null',route=null,department=null,arrival=null}通过建立存储库类/接口,更容易获得有效的结果。对于flight,您可以创建一个空接口@RepositoryRestResource public Interface FlightRepository extensed crudepository,该接口允许您对所有flight集合进行基本crud访问,并且您不必创建任何可能出错的对象。通过建立存储库类/接口,更容易获得有效结果。对于flight,您可以创建一个空接口@RepositoryRestResource公共接口FlightRepository Extended Crudepository,该接口为您提供对所有flight集合的基本crud访问权限,并且您不必创建任何可能出现问题的对象