web-dev-qa-db-fra.com

NoClassDefFoundError JsonAutoDetect lors de l'analyse d'un objet JSON

Je développe une application Web utilisant les services de cloud d'Amazon et je dois utiliser des objets JSON. Comment mon projet est mis en place est, j'ai un formulaire HTML où l'utilisateur va remplir leurs informations et soumettre. Une fois soumises, les données seront placées dans une base de données en ligne et un email de confirmation leur sera envoyé. Avant de pouvoir soumettre les données à la base de données, je dois tout placer dans un objet JSON. Ma servlet, réalisée en Java, ressemble à ceci:

public class FormHandling extends HttpServlet {
    //doGet function
    public void doGet (HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        // In this part of the code I take in the user data and build an HTML
        // page and return it to the user

        // Create String Mapping for User Data object
        Map<String,Object> userData = new HashMap<String,Object>();

        // Map the names into one struct. In the code below we are creating 
        // values for the nameStruct from the information the user has
        // submitted on the form.
        Map<String,String> nameStruct = new HashMap<String,String>();
        nameStruct.put("fName", request.getParameter("fname"));
        nameStruct.put("lName", request.getParameter("lname"));
        nameStruct.put("mInit", request.getParameter("minit"));

        // Map the three email's together (providing there are 3).
        // This is the same logic as the names.
        Map<String,String> emailStruct = new HashMap<String,String>();
        emailStruct.put("email", request.getParameter("email1"));
        emailStruct.put("email", request.getParameter("email2"));
        emailStruct.put("email", request.getParameter("email3"));

        // Put Name Hash Value Pair inside User Data Object
        userData.put("name", nameStruct);
        userData.put("emails", emailStruct);
        userData.put("age", 22);

        // Create the Json data from the userData
        createJson(userData);

        // Close writer
        out.close();
    }

    public File createJson(Map<String,Object> userData) 
        throws JsonGenerationException, JsonMappingException, IOException {
        File user = new File("user.json");

        // Create mapper object
        ObjectMapper mapper = new ObjectMapper();

        // Add the userData information to the json file
        mapper.writeValue(user, userData);
        return user;
    }
}

Lorsque je soumets le formulaire à l'aide de ce code, le message d'erreur suivant s'affiche:

Java.lang.NoClassDefFoundError: com/Fastxml/Jackson/Annotation/JsonAutoDetect com.fasterxml.jackson.databind.introspect.VisibilityChecker $ Std. (VisibilityChecker.Java:169) com.fasterxml.jackson.databind.ObjectMapper. (ObjectMapper.Java:197) edu.tcnj.FormHandling.createJson (FormHandling.Java:115) edu.tcnj.FormHandling.doGet (FormHandling.Java:104) edu.tcnj.FormHandling.doPost (FormHandling.Java:131) javax.servlet.http.HttpServlet.service (HttpServlet.Java:641) javax.servlet.http.HttpServlet.service (HttpServlet.Java:722)

Maintenant, je sais que cette erreur signifie qu’il n’a pas trouvé la bibliothèque de données de Jackson. Je développe sous Eclipse et je connais le chemin d'accès à la construction de temps en temps, alors j'ai également placé les bibliothèques dans le dossier WebContent\WEB-INF\lib. Cela a résolu des problèmes que j'ai eu avant. Cependant, cela ne semble pas résoudre mon problème cette fois-ci. J'ai même ouvert les fichiers jar pour vérifier physiquement que la bibliothèque et la classe nécessaires sont présentes, et elles le sont. J'ai essayé de chercher partout et de chercher différentes façons d'inclure la bibliothèque, mais rien ne semble fonctionner.

46
jhahn

Pour ceux qui viennent ici dans le futur, la réponse est:

Si vous avez uniquement copié jackson core et jackson databind, vous avez besoin de jackson annotations pour utiliser la variable ObjectMapper.

Par exemple, assurez-vous d'avoir quelque chose comme ceci:

[16:32:01]:/Android-project/libs     master]$ ls -lAF
total 2112
-rw-r--r--@ 1 jeffamaphone  staff   33525 Jun 18 16:06 jackson-annotations-2.0.2.jar
-rw-r--r--@ 1 jeffamaphone  staff  193693 Jun  7 16:42 jackson-core-2.0.2.jar
-rw-r--r--@ 1 jeffamaphone  staff  847121 Jun 18 15:22 jackson-databind-2.0.2.jar
127
i_am_jorf

Pour développer l'excellente réponse de @ jeffamaphone, pour les utilisateurs de maven

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

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

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.7.3</version>
</dependency>
64
Johan Sjöberg

Ou la configuration suivante:

compile 'com.fasterxml.jackson.core:jackson-core:2.2.2'
compile 'com.fasterxml.jackson.core:jackson-databind:2.2.2'
compile 'com.fasterxml.jackson.core:jackson-annotations:2.2.2'
7
userM1433372

Si vous utilisez maven et que toutes les bibliothèques sont en place, comme dans mon cas, un simple problème mvn clean et mvn install est corrigé.

1
Vilen

Si vous utilisez/utilisiez Tomcat pendant le développement dans Eclipse et que vous rencontriez cette erreur (peut-être parce que vous avez appuyé sur Republish/Clean), 

un clic droit sur le projet-> Maven-> Update Project ...

résolu ce problème pour moi.

De plus, j'ai également inclus les dépendances de Johan Sjöberg

0
kaya