web-dev-qa-db-fra.com

Comment renvoyer des données JSON du contrôleur spring à l'aide de @ResponseBody

Spring version 4.2.0, Hibernate 4.1.4 Voici ma fonction Controller:

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

Dépendance du mappeur Jackson JSON dans Pom.xml:

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

Obtenir la liste dans ma ArrayList, mais lors du retour, l'erreur suivante est affichée:

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)

Lien à l'exemple que je suis.

43
Zahid Khan

Ajoutez la dépendance ci-dessous à votre pom.xml:

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

Je faisais face au même problème. Je n'ai pas mis @ResponseBody puisque j'utilisais @RestController. Mais je continuais à avoir une erreur parce que je n’avais pas mis la méthode getter/setter pour la classe Company. Donc, après avoir mis le getter/setter, mon problème a été résolu.

83
LynAs

Vous devez également vous assurer que le bean renvoyé n'est pas vide (et peut être sérialisé par Jackson). Dans mon cas particulier, j'ai essayé de renvoyer une instance d'objet sans les accesseurs ni les setters, ni aucune annotation jackson ni champs égal à null. J'ai le message suivant:

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) )
9
ashirman

Lorsque je faisais face à ce problème, j’ai simplement mis des méthodes d’application de getter et mes problèmes ont été résolus.

J'utilise la version de démarrage Spring 2.0.

6
user5807826

Compte tenu de la réponse de @Arpit, cela ne fonctionnait pour moi que lorsque j'ajoutais deux dépendances de 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>

et configuré, de cause, web.xml <mvc:annotation-driven/>.

La réponse originale qui m'a aidé est ici: https://stackoverflow.com/a/33896080/3014866

3
Rudziankoŭ

Dans mon cas, j'utilisais jackson-databind-2.8.8.jar qui n'est pas compatible avec JDK 1.6 que je dois utiliser pour que Spring ne charge pas ce convertisseur. J'ai déclassé la version et cela fonctionne maintenant.

0
IsidroGH