如何使用 @ResponseBody 从 Spring Controller 返回 JSON 数据

Posted

技术标签:

【中文标题】如何使用 @ResponseBody 从 Spring Controller 返回 JSON 数据【英文标题】:How to return JSON data from spring Controller using @ResponseBody 【发布时间】:2015-12-30 14:09:45 【问题描述】:

春季版 4.2.0,休眠 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;

Pom.xml 中的 Jackson JSON 映射器依赖项:

    <!-- 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 我正在关注的示例。

【问题讨论】:

你能发布你的弹簧配置吗? @RafikBELDI 伙计,一切都很好,只是 spring 配置无法添加太多有问题的代码,因为它需要描述。 我的问题是所有的 getter 都是私有的。 谢谢,@peter。我的 getter 是包私有的,但它们需要公开。 【参考方案1】:

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

【讨论】:

只添加 getter 就足够了。 这是正确答案。不应该添加更多的依赖项。 感谢同样为我工作。但一点也不惊讶这真的很重要。 为我工作。在我的情况下,设置对公共的字段访问也很有效。 是的,这行得通。 Spring 应该更具体地修复该错误。【参考方案2】:

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

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

【讨论】:

让我很开心,只是花了更多的 4 个小时,甚至没有人在任何地方提到这一点。 添加依赖项对我来说是关键!谢谢! 依赖项对我来说也是关键。我想知道他们为什么不在 Spring 的页面 howto 中写下来:docs.spring.io/spring-boot/docs/current/reference/html/… 也为我工作!对于路过并始终选择使用依赖项的最新版本而不是此处提到的用户的一点注意事项。不要使用最新版本的杰克逊依赖!我试过 2.7.0-rc1 但没有用。 2.6.3 工作得很好。 这不是 spring4.x 的情况。只添加 getter/setter 就足够了。【参考方案3】:

您还需要确保返回的 bean 不为空(并且可以由 Jackson 序列化)。在我的特殊情况下,我尝试返回一个没有 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) )

【讨论】:

这更多的是评论(不是答案)。【参考方案4】:

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

我使用的是 Spring Boot 2.0 版。

【讨论】:

添加 getter 和 setter 现在可以解决这种情况下的问题【参考方案5】:

考虑到@Arpit 的答案,对我来说,它只有在我添加两个杰克逊依赖项时才有效:

<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 &lt;mvc:annotation-driven/&gt;

对我有帮助的原始答案在这里:https://***.com/a/33896080/3014866

【讨论】:

【参考方案6】:

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

如果我们使用以下依赖项,添加 getter/setter 就足够了。

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

Jackson 核心课程也随之而来。

【讨论】:

【参考方案7】:

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

【讨论】:

【参考方案8】:

在我的情况下,我使用的 jackson-databind-2.8.8.jarJDK 1.6 不兼容,我需要使用因此 Spring 没有加载此转换器。我降级了版本,现在可以使用了。

【讨论】:

以上是关于如何使用 @ResponseBody 从 Spring Controller 返回 JSON 数据的主要内容,如果未能解决你的问题,请参考以下文章

springmvc 的@ResponseBody 如何使用JSONP?

16个Spring注解,你知道的有几个?

java如何直接从流中读取excel的文件内容?Stream

406(不可接受)。尝试使用 @Responsebody 将对象或整数从 spring 处理函数返回到 ajax 请求

在 Spring MVC 中,如何在使用 @ResponseBody 时设置 mime 类型标头

如何使用@ResponseBody创建jpa实体加入关系