2012-04-10 21 views
46

Estoy desarrollando una aplicación web utilizando los servicios en la nube de Amazon y necesito hacer uso de los objetos JSON. Cómo está configurado mi proyecto es que tengo un formulario HTML donde el usuario completará su información y la enviará. Una vez enviados, los datos se colocarán en una base de datos en línea y se les enviará un correo electrónico de confirmación. Antes de poder enviar los datos a la base de datos, necesito colocarlos en un objeto JSON. Mi servlet, hecho en Java, es el siguiente:NoClassDefFoundError JsonAutoDetect al analizar el objeto JSON

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

Cuando envío del formulario utilizando este código me sale el siguiente mensaje de error:

java.lang.NoClassDefFoundError: com/fasterxml/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)

Ahora sé que significa que el error que ISN' t encontrando la biblioteca de datos de Jackson. Estoy desarrollando en Eclipse y sé que la ruta de compilación se estropea de vez en cuando, así que también coloqué las bibliotecas en la carpeta WebContent \ WEB-INF \ lib. Esto ha resuelto problemas que tuve antes. Sin embargo, esto no parece resolver mi problema esta vez. Incluso he abierto los archivos jar para verificar físicamente que la biblioteca y la clase necesaria estén allí, y lo son. He intentado buscar por todas partes y buscar diferentes formas de incluir la biblioteca, pero parece que nada funciona.

+0

¿Puede hacernos saber qué versión de la biblioteca de Jackson que está utilizando? –

+0

Necesito dos JAR, 'jackson-core-lgpl-1.5.6.jar' y' jackson-mapper-lgpl-1.5.6.jar' –

+3

Resulta que me faltaba una tercera jarra ... ugh. Tan sencillo. Para mí, necesito usar las bibliotecas de anotación de datos, núcleo y anotación de jackson. Estoy usando la versión 2.0. Una vez que encontré ese tercer jarro estaba feliz. ¡Gracias de cualquier forma! – jhahn

Respuesta

125

Para aquellos que vienen aquí en el futuro, la respuesta es:

Si sólo ha copiado jackson core y jackson databind, es necesario utilizar el jackson annotationsObjectMapper.

Por ejemplo, asegúrese de que tiene algo como esto:

[16:32:01]:/android-project/libs  master]$ ls -lAF 
total 2112 
[email protected] 1 jeffamaphone staff 33525 Jun 18 16:06 jackson-annotations-2.0.2.jar 
[email protected] 1 jeffamaphone staff 193693 Jun 7 16:42 jackson-core-2.0.2.jar 
[email protected] 1 jeffamaphone staff 847121 Jun 18 15:22 jackson-databind-2.0.2.jar 
+11

y que se puede descargar desde http://wiki.fasterxml.com/JacksonDownload. (ahorra un google.) – ericsoco

+0

¿Es incluso posible escribir y leer desde y hacia JSON con Jackson sin la ObjectMapper? – CorayThan

+0

En ese momento, en mi caso, era posible leer algunos JSON sin él. No estoy seguro de cuál es el estado de las cosas ahora. –

63

Para ampliar excelente respuesta de @ jeffamaphone, para los usuarios 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> 
+1

Gracias, Esto funcionó para mí después de hacer el tutorial primavera acessing Twitter Datos https : //spring.io/guides/gs/accessing-twitter/ – wired00

+0

trabajó para mí también. Gracias – siddhusingh

7

O la siguiente configuración Gradle:

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' 
1

Si usa maven y tiene todas las bibliotecas en su lugar como en mi caso, un simple mvn clean y mvn install problema solucionado.

0

Si está/estaba utilizando Tomcat mientras que el desarrollo en Eclipse y consiguió este error (tal vez debido a que pulsó republicación/limpia),

un clic derecho en el Proyecto-> Maven-> Proyecto de Actualización ...

resolvió este problema para mí.

Además, he incluido también las dependencias de Johan Sjöberg