当前位置: 首页 > 知识库问答 >
问题:

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

陈俊誉
2023-03-14

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

这是我要发布的对象:

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

}

这是路线类:

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个答案

董洲
2023-03-14

控制器内部的代码本身可能是错误的:复制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;
}

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

吕高昂
2023-03-14

由于控制器仅部分发布(即:仅发布方法,而非完整类),因此我将假设它与它得到的一样简单,并且它已被注释为@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
}

请注意,在我的回答中,我将日期设置为空。对于那些你必须确保你提供的格式被接受。使用我在开始时解释的技巧,试着找出一种可能的日期格式。

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

另外,当你有时间的时候,帮助你自己完成龙目岛项目。它将为您节省大量样板代码,在getters和setters的情况下,这往往是意外问题的根源。

 类似资料:
  • 我在JSONbin中有JSON对象。io具有以下结构。 我正在尝试使用改造将新数据条目发布到和等中。但是,我似乎无法找出在我的接口中描述的正确endpoint,正如您在我下面发布的代码段中看到的那样。每当我运行应用程序时,404响应代码都会记录在我的logcat中,并且新记录显然不是POST-ed。 主要活动 pojo_用户 JsonBinAPI

  • 我正在尝试使用grpc实现pub-sub模式,但我对如何正确地实现它有点困惑。 我的协议:rpc调用(google.protobuf.Empty)返回(流数据) 客户: 服务器服务: 如何正确地从全局观察员中删除客户端?当连接中断时,如何接收某种信号 如何管理客户端-服务器重新连接?如何在连接断开时强制客户端重新连接? 提前感谢!

  • 下面是我使用的代码 这就是api需要发布的方式 我收到一个错误,指出 另一个。子字段是必需的。 我如何通过restAsaud发布这个?其他API不需要通过嵌套工作发布,所以我假设这就是它失败的原因。

  • 问题内容: 以下示例摘自Brian Goetz第3章第3.5.1节的“实践中的Java并发性”一书。这是对象发布不当的示例 它说,持有人可能以不一致的状态出现在另一个线程上,而另一个线程可以观察到部分构造的对象。怎么会这样 您能否使用以上示例给出一个方案? 它还继续说,在某些情况下,线程在第一次读取字段时可能会看到过时的值,而在下次读取时可能会看到最新的值,这就是为什么assertSanity会引

  • 我想使用这种格式的多维数组:值[n][],其中n是问题号。使用此新设置,您最终应该使用以下复选框字段: 请注意,选定的值编码在value属性中。name属性只包含值所属的问题。 因此,上述输入说明的是: 我想在下面的“问题”和“答案”数据库表中插入这些详细信息: 问题表: 答题表: 现在,我已经尝试编写下面的mysqli/php代码,将这些值插入数据库,但我收到错误,并在想要实现我想要实现的目标时

  • 问题内容: 我正在尝试将JSON发布到WCF服务。json对象包含一个数组。我想知道如何正确绑定到我的数据合同。如果有人可以在这里给我指点,我将不胜感激。目前,我的购物车对象为null 我的服务界面如下所示: 我的客户电话如下 客户电话 我的JSON看起来像这样 问题答案: Fiddler对WCF REST方法的原始请求应如下所示: JSON中的响应如下所示: