2011-12-04 4 views
13

JSON 객체를 만들 때 Jackson 라이브러리를 사용하고 있지만 mapper.writeValue (System.out, responseData) 함수를 사용하면 프로그램이 종료됩니다.Java 프로그램이 ObjectMapper.writeValue (System.out, responseData) 이후에 종료 됨 - 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(); 
     } 
    }. 

} 

이 실행 된 후, 콘솔 쇼 { "ID가": 1}하지만, "완료"표시되지 않습니다 여기 내 코드입니다.

답변

15

ObjectMapper._configAndWriteValue가 PrintStream.close()를 호출하는 UtfGenerator.close()를 호출하기 때문에 문제는 Jackson 구현에 있습니다. 데이터 파일/게터 파일의 변수 이름을 선언하지만,

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

이것은 버그가 아니며, 기능입니다. 기본적으로 OutputStream은 고수준의 ObjectMapper.writeValue() 메소드를 사용할 때 실제로 닫힙니다. 그러나 실제 문제에 대한 좋은 설명. 동작을 원하지 않으면 ObjectMapper에서 해당 기능 ('JsonGenerator.Feature.AUTO_CLOSE_TARGET')을 비활성화 할 수 있습니다 :'mapper.disable (JsonGenerator.Feature.AUTO_CLOSE_TARGET)' – StaxMan

+0

비활성화 메서드의 다른 오버로드 된 버전이 유용 할 것으로 보입니다. 현재 JsonGenerator.Feature를 사용하는 메소드는 없습니다. –

+6

확인. 예,'mapper.configure (JsonGenerator.Feature.AUTO_CLOSE_TARGET, false)'가있을 것입니다 만, 빠져있는 경우는, 편의적 메소드도 추가 할 필요가 있습니다. – StaxMan

-3

을 :

나는 다음 당신이 할 수있는 폐쇄 대상의 기본 동작을 변경하려면 https://jira.codehaus.org/browse/JACKSON

에 문제를 기록 할 것 첫 번째 문자는 작아야합니다.

+0

이것은 실제로 질문에 대답하지 않습니다. 다른 질문이있는 경우 [질문하기] (http://stackoverflow.com/questions/ask)를 클릭하여 질문 할 수 있습니다. 당신은 [현상금을 추가] (http://stackoverflow.com/help/privileges/set-bounties)하면 충분한 [평판] (http://stackoverflow.com/help/)이 일단이 질문에 더 많은 관심을 끌 수 있습니다. 평판). –

+0

@JRichardSnape - 동의하지 않습니다. 첫 번째 문장과 서명이 필요하지만 전반적인 메시지는 변수가 대소 문자를 구분하므로 문제가 발생한다는 것입니다. 대답은 틀릴 수도 있지만 여전히 질문에 답하려고합니다. – SomethingDark

+0

@SomethingDark 충분히 공정하게 - 나는 당신의 편집을 보았습니다. 나는 여기에 답을하려는 시도가 있다고 생각합니다. 어쩌면 리뷰 대기열에 잠깐 들렀습니다. –