如何使用@ResponseBody return JSON 来自 spring 控制器的数据

How to return JSON data from spring Controller using @ResponseBody

Spring 版本 4.2.0,Hibernate 4.1.4 这是我的 Controller 函数:

@RequestMapping(value = "/mobile/getcomp", method = RequestMethod.GET)
@ResponseBody
public List<Company>  listforCompanies() {      
    List<Company> listOfCompanies= new ArrayList<Company>();        
    listOfCompanies = companyManager.getAllCompanies();
    return listOfCompanies;
}

Jackson JSON 映射器依赖 Pom.xml:

    <!-- Jackson JSON Mapper -->
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>${jackson.version}</version>
    </dependency>

在我的 ArrayList 中获取列表,但返回时显示以下错误:

SEVERE: Servlet.service() for servlet [dispatcherServlet] in context with path [/IrApp] threw exception [Request processing failed; nested exception is java.lang.IllegalArgumentException: No converter found for return value of type: class java.util.ArrayList] with root cause
    java.lang.IllegalArgumentException: No converter found for return value of type: class java.util.ArrayList
        at org.springframework.util.Assert.isTrue(Assert.java:68)
        at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:124)

Link 我下面的例子。

将以下依赖项添加到您的 pom.xml:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.5.0</version>
</dependency>

您还需要确保 returned bean 不为空(并且可以由 Jackson 序列化)。在我的特殊情况下,我尝试 return 一个没有 getter 和 setter 并且没有任何 jackson 注释并且字段等于 null 的对象实例。我收到以下消息:

com.fasterxml.jackson.databind.JsonMappingException:
    No serializer found for class com.foo.bar.Baz and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) )

我遇到了同样的问题。我没有输入 @ResponseBody,因为我使用的是 @RestController。但是我仍然遇到错误,因为我没有为公司 class 放置 getter/setter 方法。所以在输入 getter/setter 之后我的问题就解决了。

考虑到@Arpit 的回答,对我来说只有当我添加两个 jackson 依赖项时它才有效:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.4.3</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.4.3</version>
</dependency>

并配置,当然,web.xml <mvc:annotation-driven/>

对我有帮助的原始答案在这里:

当我遇到这个问题时,我只是简单地输入 getter setter 方法,我的问题就得到了解决。

我正在使用 Spring 引导版本 2.0。

在我的例子中,我使用的 jackson-databind-2.8.8.jarJDK 1.6 不兼容,我需要使用,所以 Spring 没有加载这个转换器。我降级了版本,现在可以使用了。

我在使用 groovy+springboot 时遇到了这个错误。

Adding getter/setter is enough if we are using below dependency.

implementation 'org.springframework.boot:spring-boot-starter-web'

作为杰克逊的核心类随它而来。

是的,只需添加带有 public 修饰符的 setters/getters ;)