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.
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
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>
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'
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é.
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