如何使用 Spring Boot 返回一组对象?

Posted

技术标签:

【中文标题】如何使用 Spring Boot 返回一组对象?【英文标题】:How to return a set of objects with 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;

【问题讨论】:

【参考方案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],你能确认一下吗?

以上是关于如何使用 Spring Boot 返回一组对象?的主要内容,如果未能解决你的问题,请参考以下文章

spring-boot-framework 如何自动将对象返回成json格式

如何在 Spring Boot Rest API 中以 XML 形式返回对象列表

在java Spring Boot中,如何在集成测试中将内存中的LDAPConnection对象传递给ldapService?

spring boot 应用程序:jpa 查询返回旧数据

Spring Boot - 返回带有对象数组的 JSON

Spring Boot项目中如何定制PropertyEditors