【问题标题】:How to return a set of objects with Spring Boot?如何使用 Spring Boot 返回一组对象?
【发布时间】:2017-06-02 19:33:52
【问题描述】:

我对@9​​87654323@ 做了a lesson,它运行良好。但是如果我想返回一组对象呢?我尝试做this,但它不起作用。我怎样才能正确地做到这一点?

只有一个对象(有效):

@RequestMapping("/greeting")
public Greeting greeting(@RequestParam(value="name", defaultValue = "World") String name) {
    return new Greeting(counter.incrementAndGet(),
            String.format(template, name));
}

有很多对象(不起作用):

@RequestMapping(value = "/greeting", method = RequestMethod.GET, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody List<Greeting> greeting() {
    Greeting greeting1 = new Greeting(1, "One");
    Greeting greeting2 = new Greeting(2, "Two");
    List<Greeting> list = new ArrayList<>();
    list.add(greeting1);
    list.add(greeting2);
    return list;
}

【问题讨论】:

    标签: java spring spring-boot


    【解决方案1】:

    这是我为此编写的代码 sn-p。从您的 @RequestMapping 注释中删除“消费”,因为您没有在您的方法中使用它。

    @RestController
    public class GreetingsController
    {
        @RequestMapping(value = "greetings", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
        public @ResponseBody
        List<Greeting> greeting() {
            Greeting greeting1 = new Greeting(1, "One");
            Greeting greeting2 = new Greeting(2, "Two");
            List<Greeting> list = new ArrayList<>();
            list.add(greeting1);
            list.add(greeting2);
            return list;
        }
    
        public class Greeting
        {
            private String message;
            private int count;
    
            public Greeting(int count, String message)
            {
                this.count = count;
                this.message = message;
            }
    
            public String getMessage()
            {
                return message;
            }
    
            public void setMessage(String message)
            {
                this.message = message;
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      如果您将原始方法与新制作的方法(使用List)进行比较,您会发现一些差异。

      首先,在@RequestMapping 注释中,您现在使用属性consumesproducesproduces 在这里不是问题,因为您正在生成一个应该是 JSON 的响应。 但是你没有消费任何东西,所以你应该离开consumes

      @RequestMapping(value = "/greeting", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
      public @ResponseBody List<Greeting> greeting() {
          Greeting greeting1 = new Greeting(1, "One");
          Greeting greeting2 = new Greeting(2, "Two");
          List<Greeting> list = new ArrayList<>();
          list.add(greeting1);
          list.add(greeting2);
          return list;
      }
      

      作为旁注,您可能还注意到您使用了@ResponseBody 注释。把它放在这里不会导致任何错误,但这不是必需的,因为如果你正确地遵循了 Spring 教程,你应该已经用 @RestController 注释你的控制器并且这样做,你已经告诉 Spring 它将使用一个响应身体。

      【讨论】:

      • 请注意:Jackson 还添加了 XML 序列化。一旦你把它放在类路径上,它就不再那么确定 Spring 默认生成什么,我已经看到端点因此从 JSON 切换到 XML 序列化。最好具体说明生产属性。
      【解决方案3】:

      假设我们有 CarDetails Pojo 的列表,我们想将它们退回

      @RestController
      public class CarDetailController {
        @GetMapping("/viewAllCarDetailList")
          public List<CarDetail> retrieveAllCarDetails() {
              List<CarDetail> contacts = new ArrayList<CarDetail>();
      
              CarDetail objt = new CarDetail();
              objt.setCarModel("hyundai");
              objt.setSubModel("I10");
              CarDetail objt2 = new CarDetail();
              objt2.setCarModel("hyundai");
              objt2.setSubModel("I20");        
              contacts.add(objt);
              contacts.add(objt2);
              return contacts;
          }
      }
          public class CarDetails {
      
                  private String carModel;
                  private String subModel;
      // Will haave Setter getter and hash code equls method
      //and constructor
          }
      

      这个 JSON 将被输出:-

      [
          {
              "carModel": "hyundai",
              "subModel": "I10"
          },
          {
              "carModel": "hyundai",
              "subModel": "I20"
          }
      ]
      

      【讨论】:

      • 如果我们想给数组添加一个字段值怎么办? (像这样 { "carModels" : [{objec1}, {object2}]}。有没有办法在不创建单独对象的情况下做到这一点?
      • 你想要这样的回应:- { "carModels" : [{I10}, {I20},{Inovoa}]},你能确认一下吗?
      猜你喜欢
      • 1970-01-01
      • 2022-01-01
      • 2020-04-14
      • 1970-01-01
      • 2020-02-11
      • 1970-01-01
      • 2021-03-25
      • 1970-01-01
      • 2016-05-16
      相关资源
      最近更新 更多