【问题标题】:Java REST service that accepts list of objects接受对象列表的 Java REST 服务
【发布时间】:2016-12-21 19:44:23
【问题描述】:

我必须编写一个 REST 服务方法,该方法接受对象列表作为参数来计算某些内容并返回结果。

到目前为止:

@RequestMapping(value = "generateBill/{id}/{rates}")
public String generateBill(@PathVariable Long id, @PathVariable Rate rates[]) {
   // do things
   return "OK";
}

但我确信@PathVariable Rate rates[] 是错误的。

我也必须编写客户端部分,我也不知道该怎么做。第一次写这样的REST Service方法。

编辑:费率如下所示:

public class Rate {
   Long version;
   Double amount;
   Date validFrom;
   Date validUntil;
}

【问题讨论】:

    标签: java spring rest


    【解决方案1】:

    您应该将对象放在POST 请求的正文中,而不是使用 URL:

    @RequestMapping(value = "generateBill/{id}", method = RequestMethod.POST)
    public String generateBill(@PathVariable Long id, @RequestBody BillingRequest billingRequest) {
       // do things
    }
    

    此外,直接在有效负载中映射一个集合是不可进化的(你不能在数组之外添加新的“字段”),将你的数组包装在 JSON 对象中通常是一个好习惯:

    public class BillingRequest {
        List<Rate> rates;
        // Here you could add other fields in the future
    }
    

    您调用服务的 HTTP 请求如下所示:

    POST / HTTP/1.1
    {  
      "rates" : [
         {
           "version" : 1,
           "amount" : 33.3,
           "validFrom" : "2016-01-01",
           "validUntil" : "2017-01-01" 
         },
         {
           "version" : 2,
           "amount" : 10.0,
           "validFrom" : "2016-02-01",
           "validUntil" : "2016-10-01" 
         }
       ] 
    }
    

    关于你的模型的最后一条建议:

    • 使用java.time.LocalDate(或jodatime)代替java.util.Date。如果您需要日期+时间,请使用java.time.ZonedDateTime(如果您使用jodatime,请使用DateTime
    • 使用java.math.BigDecimal 表示准确的数字。浮点数,例如 Double can lose precision

    编辑:我建议使用Instant 而不是ZonedDateTime,这是一个带有UTC 时区的时间戳。当然,除非您的域需要不同的时区。

    【讨论】:

    • 非常感谢!我接受了另一个解决方案,因为他先回答,但我认为你的也应该被接受,但我不能接受两个..
    【解决方案2】:

    第一个解决方案:

    @RequestMapping(value = "generateBill/{id}/{rates}", method=RequestMethod.GET)
    public String generateBill(@PathVariable Long id, @PathVariable Rate[] rates) {
       // do things
       return "OK";
    }
    

    或者第二个(更多Java风格;)):

    @RequestMapping(value = "generateBill/{id}/{rates}", method=RequestMethod.GET)
    public String generateBill(@PathVariable Long id, @PathVariable List<Rate> rates) {
       // do things
       return "OK";
    }
    

    这个你可以这样称呼:

    获取: http://localhost:8080/public/generateBill/1/1,2,3,4 其中 1.2,3,4 替换为您的值,这取决于 Rate 到底是什么;)


    编辑

    更新后,您似乎想要使用 POST 方法(您正在发布费率列表),然后这里已经回答了问题。 receiving json and deserializing as List of object at spring mvc controller

    【讨论】:

    • 好的,所以我没有错;P 但是对于客户端呢?如何在 url 中传递列表?
    • 如果有数组,则转换为List ;)
    • 检查我的编辑。但是,如果您需要传递您的对象,最好使用第一个解决方案;)
    • 好的,但我的问题是 Rate 是一个具有不同属性的对象(请参阅我的编辑),所以我不知道如何将该列表添加到 url。
    • 那么,它将是 POST 并且您将发布 JSON 对象;) 在这种情况下,您已经进行了 POST 并设置了您想要映射您的 Rate 类。这里已经用示例回答了问题stackoverflow.com/questions/23012841/…
    【解决方案3】:

    其他解决方案是使用 JSON String 格式作为参数,然后进行解析。类似的东西

    [
    {
    "rates":1, "name":"rate1" }, {
    "rates":2, "name":"rate2" }, {
    "rates":3, "name":"rate3" } ]

    然后将 json 解析为您的对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-05
      • 1970-01-01
      • 2016-06-27
      相关资源
      最近更新 更多