web-dev-qa-db-fra.com

Spring MVC et JSON, exception de classe Jackson non trouvée

Je n'arrive pas à faire fonctionner le support JSON de Spring. Dans mon fichier spring-servlet.xml, j'ai inclus les lignes suivantes:

<mvc:annotation-driven/>
<context:component-scan base-package="my.packagename.here" />
<context:annotation-config />

<bean id="viewResolver"
    class="org.springframework.web.servlet.view.InternalResourceViewResolver"
    p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" />

<bean id="jacksonMessageConverter"
    class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>

J'ai également téléchargé des bibliothèques Jackson et les ai ajoutées à mon projet Eclipse ainsi qu'au dossier WEB-INF/lib. Lors de l'envoi d'une requête au contrôleur avec la méthode getJSON de jQuery, j'obtiens les erreurs suivantes:

javax.servlet.ServletException: Servlet.init() for servlet dispatcher threw exception
Java.lang.NoClassDefFoundError: org/codehaus/jackson/JsonProcessingException
Java.lang.ClassNotFoundException: org.codehaus.jackson.JsonProcessingException

Que pensez-vous est le problème. Je suppose que cela a quelque chose à voir avec mon fichier spring-servlet.xml. Je peux coller tout le journal des erreurs, si vous en avez besoin.

13
jyriand

JsonProcessingException fait partie de jackson-core-asl-x.x.x.jar. Assurez-vous que cela fait partie de votre chemin de classe. 

5
gouki

Pour les pots Jackson v2, la classe à utiliser pour le haricot doit être 

<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />

Pour les anciennes versions de jackson, org.springframework.http.converter.json.MappingJacksonHttpMessageConverter est correct. Assurez-vous que les fichiers jar sont ajoutés à la bibliothèque du projet.

43
Anshul Tiwari

La réponse de anshul tiwari résout partiellement le problème. Voici une réponse plus complète ...

Lorsque Jackson est passé à la version 2.0, la bibliothèque principale jackson-core-asl-x.x.x.jar a été changée en jackson-core-x.x.x.jar. Avec cela, les chemins ont changé. Dans la version 1, org.codehaus.jackson était le chemin. Dans la version 2, il est dans com.fasterxml.jackson.core si vous ouvrez le fichier jar. 

Maintenant, si vous avez les bibliothèques de la version 2 et que vous voyez l'exception ClassNotFoundException de org.codehaus.jackson, cela signifie qu'il y a un mélange de versions. Certains codes attendent la v1 mais vous avez fourni la v2. Ceci est certainement possible avec Spring, vous devez donc choisir le fichier JAR correct pour votre code.

MODIFIER

En fait, en regardant le code source Spring 3.2, org.springframework.http.converter.json.MappingJacksonHttpMessageConverter fait toujours référence au matériel org.codehaus. Il s’agit donc d’un cas où le code source Spring doit importer le chemin correct et que le développeur ne peut rien faire pour utiliser Jackson 2.

10
demongolem

Juste pour compléter la réponse anshul tiwari, la balise bean devrait aller dans mvc: annotation-driver:

<mvc:annotation-driven>
    <mvc:message-converters>
        <bean
            class="org.springframework.http.converter.ResourceHttpMessageConverter" />
        <!-- <bean -->
        <!-- class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter" 
            /> -->
        <bean
            class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
        <!-- <bean -->
        <!-- class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" 
            /> -->
    </mvc:message-converters>
</mvc:annotation-driven>
1
Tiago PC

Utilisez-le comme ci-dessous: J'espère que cela fonctionnera ..

http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd " default-lazy-init =" true ">

<context:component-scan base-package="com.vc.bmp.resource" />
<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <!-- property name="prefixJson" value="true" />
            <property name="supportedMediaTypes" value="application/json" /-->
            <property name="objectMapper">
                <bean class="com.fasterxml.jackson.databind.ObjectMapper">
                    <property name="serializationInclusion">
                        <value type="com.fasterxml.jackson.annotation.JsonInclude.Include">NON_NULL</value>
                    </property>
                </bean>
            </property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

0
Anadi krishna