2011-12-04 8 views
13

Sto usando la libreria di Jackson per creare oggetti JSON, ma quando uso la funzione mapper.writeValue (System.out, responseData), il programma termina. Ecco il mio codice:Programma Java che termina dopo ObjectMapper.writeValue (System.out, responseData) - Jackson Library

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(); 
     } 
    }. 

} 

Dopo questo viene eseguito, gli spettacoli console { "id": 1}, ma non mostra "fatto".

risposta

15

Il problema riguarda l'implementazione di Jackson, poiché ObjectMapper._configAndWriteValue chiama UtfGenerator.close(), che chiama PrintStream.close().

mi piacerebbe registrare un problema a https://jira.codehaus.org/browse/JACKSON

Per modificare il comportamento predefinito di destinazione essere chiuso è possibile effettuare le seguenti operazioni:

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

Non è un bug, è una funzionalità: per impostazione predefinita, OutputStream è effettivamente chiuso quando si utilizzano metodi ObjectMapper.writeValue() di alto livello. Ma buona spiegazione del problema attuale. È possibile disabilitare tale funzione ('JsonGenerator.Feature.AUTO_CLOSE_TARGET') su ObjectMapper, se non si desidera un comportamento:' mapper.disable (JsonGenerator.Feature.AUTO_CLOSE_TARGET) ' – StaxMan

+0

Sembra che sia disponibile un'altra versione sovraccaricata del metodo disable. Attualmente non ce n'è uno che prenda JsonGenerator.Feature. –

+6

Ok. Sì, ci dovrebbe quindi essere 'mapper.configure (JsonGenerator.Feature.AUTO_CLOSE_TARGET, false)' ma concesso dovrebbe anche aggiungere metodi di convenienza se mancano. – StaxMan

-3

Pur dichiarando nomi delle variabili nei file di dati/file getter, la prima lettera dovrebbe essere piccola.

+0

Questo in realtà non risponde alla domanda. Se hai una domanda diversa, puoi richiederla facendo clic su [Invia domanda] (http://stackoverflow.com/questions/ask). Puoi anche [aggiungere una taglia] (http://stackoverflow.com/help/privileges/set-bounties) per attirare maggiormente l'attenzione su questa domanda una volta che hai abbastanza [reputazione] (http://stackoverflow.com/help/ che cosa è-la reputazione). –

+0

@JRichardSnape - Non sono d'accordo. Mentre la prima frase e la firma devono andare, il messaggio generale è che il problema deriva dal fatto che le variabili fanno distinzione tra maiuscole e minuscole. La risposta potrebbe essere sbagliata, ma tenta comunque di rispondere alla domanda. – SomethingDark

+0

@SomethingDark Abbastanza giusto - Vedo la tua modifica. Immagino che ci sia un tentativo di rispondere qui - forse ero un po 'svelto nella coda delle recensioni. –