2011-12-04 10 views
13

Estoy usando la biblioteca Jackson para crear objetos JSON, pero cuando uso la función mapper.writeValue (System.out, responseData), la programa termina. Aquí está mi código:Programa Java que termina después de ObjectMapper.writeValue (System.out, responseData) - Biblioteca Jackson

import java.io.IOException; 
import java.util.HashMap; 
import java.util.Map; 

import org.codehaus.jackson.JsonGenerationException; 
import org.codehaus.jackson.map.JsonMappingException; 
import org.codehaus.jackson.map.ObjectMapper; 

public class Test { 

    public static void main(String[] args){ 
     new Test().test(); 
    } 

    public void test() { 
     ObjectMapper mapper = new ObjectMapper(); 
     Map<String, Object> responseData = new HashMap<String, Object>(); 

     responseData.put("id", 1); 

     try { 
      mapper.writeValue(System.out, responseData); 
      System.out.println("done"); 
     } catch (JsonGenerationException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (JsonMappingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    }. 

} 

Después de esto se ejecuta, los espectáculos de la consola { "id": 1}, pero no muestra "hecho".

Respuesta

15

El problema es con la implementación de Jackson, ya que ObjectMapper._configAndWriteValue llama a UtfGenerator.close(), que llama a PrintStream.close().

me gustaría registrar un tema en https://jira.codehaus.org/browse/JACKSON

Para cambiar el comportamiento predeterminado de destino que se está cerrada, puede hacer lo siguiente:

mapper.configure(JsonGenerator.Feature.AUTO_CLOSE_TARGET, false); 
+3

No es un error, es una función: de manera predeterminada, OutputStream se cierra al utilizar métodos ObjectMapper.writeValue() de alto nivel. Pero una buena explicación del problema real. Puede desactivar esa característica ('JsonGenerator.Feature.AUTO_CLOSE_TARGET') en ObjectMapper, si el comportamiento no es deseado:' mapper.disable (JsonGenerator.Feature.AUTO_CLOSE_TARGET) ' – StaxMan

+0

Parece que otra versión sobrecargada del método de desactivación sería útil. Actualmente, no hay uno que tome un JsonGenerator.Feature. –

+6

Ok. Sí, debería haber 'mapper.configure (JsonGenerator.Feature.AUTO_CLOSE_TARGET, false)', pero también debería agregar métodos de conveniencia si faltan. – StaxMan

-3

Mientras que declarar los nombres de variables en los archivos de datos/archivos getter, la primera letra debe ser pequeña.

+0

Esto realmente no responde la pregunta. Si tiene una pregunta diferente, puede formularla haciendo clic en [Preguntar pregunta] (http://stackoverflow.com/questions/ask). También puede [agregar una recompensa] (http://stackoverflow.com/help/privileges/set-bounties) para atraer más atención a esta pregunta una vez que tenga suficiente [reputación] (http://stackoverflow.com/help/ que-reputación). –

+0

@JRichardSnape - No estoy de acuerdo. Mientras que la primera oración y la firma deben ir, el mensaje general es que el problema proviene de que las variables distingan entre mayúsculas y minúsculas. La respuesta puede ser incorrecta, pero aún intenta responder la pregunta. – SomethingDark

+0

@ SomethingDark Es suficiente, veo tu edición. Supongo que hay un intento de responder aquí, tal vez fui un poco rápido en la cola de revisión. –

Cuestiones relacionadas