如何使用@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.jar
与 JDK 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 ;)
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.jar
与 JDK 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 ;)