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

时间:2015-10-02 11:11:36

标签: java json spring spring-mvc spring-4

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;
}

杰出的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我跟随的例子。

8 个答案:

答案 0 :(得分:99)

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

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

答案 1 :(得分:83)

我遇到了同样的问题。自从我使用@ResponseBody以来,我没有放@RestController。但是我仍然遇到错误,因为我没有为公司类放置getter/setter方法。所以放完getter/setter我的问题就解决了。

答案 2 :(得分:9)

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

Workspace openContents: 'GTPlayground setGTPlaygroundEnabledStatus: false.
" ========== Debuggers ========== "

Nautilus pluginClasses: nil.
SpecDebugger closeAllDebuggers.
GTGenericStackDebugger closeAllDebuggers.
GTGenericStackDebugger setGTDebuggerEnabledStatus: false.

" ========== Miscellany ========== "

GTInspector setGTInspectorEnabledStatus: false.
GTExampleOrganizer stop.
GTEventRecorder cleanUp.
GTEventRecorderSettings cleanUp.
GTSnippets reset.
GTPlayBook reset.
GTPlayBook resetDirectories.
GTSpotter cleanUp.
GTSpotterGlobalShortcut reset.

GlobalIdentifier cleanUp.
Privacy cleanUp.

" ========== QA ========== "
QASettings inspectorPluggin: false.
QASettings spotterPlugin: false.
QAEventCollector unload.
(MCPackage named: ''QualityAssistant'') unload.

" ========== RPackage ========== "
RPackageOrganizer default packageNames
    select: [ :each | each beginsWith: ''GT'' ]
    thenDo: [ :each |
        (MCPackage named: each) unload.
        RPackageOrganizer default unregisterPackageNamed: each.
        " Possibly unnecessary... "
        Smalltalk removeEmptyMessageCategories.
        Smalltalk cleanOutUndeclared.
        Smalltalk fixObsoleteReferences.
        Smalltalk globals flushClassNameCache ].  
Behavior flushEvents.
Behavior flushObsoleteSubclasses.
SmalltalkImage current resetTools.'

答案 3 :(得分:6)

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

我正在使用Spring启动版2.0。

答案 4 :(得分:3)

考虑到@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/>

帮助我的原始答案就在这里:https://stackoverflow.com/a/33896080/3014866

答案 5 :(得分:3)

是的,只需添加带有公共修饰符的二传手/ getters;)

答案 6 :(得分:0)

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

答案 7 :(得分:0)

我正在使用groovy + springboot并收到此错误。

  

如果我们使用以下依赖项,则只需添加getter / setter就可以了。

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

随着Jackson核心课程随之而来。