2011-12-04 25 views
13

Tôi đang sử dụng thư viện Jackson để tạo các đối tượng JSON, nhưng khi tôi sử dụng hàm mapper.writeValue (System.out, responseData), chương trình chấm dứt. Đây là mã của tôi:Chương trình Java chấm dứt sau khi ObjectMapper.writeValue (System.out, responseData) - Thư viện 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(); 
     } 
    }. 

} 

Sau khi thực hiện, bảng điều khiển hiển thị {"id": 1}, nhưng không hiển thị "đã hoàn tất".

Trả lời

15

Vấn đề là với việc triển khai Jackson, như ObjectMapper._configAndWriteValue gọi UtfGenerator.close(), gọi PrintStream.close().

Tôi muốn đăng một vấn đề tại https://jira.codehaus.org/browse/JACKSON

Để thay đổi hành vi mặc định của mục tiêu bị đóng, bạn có thể làm như sau:

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

Đó không phải là lỗi, tính năng của nó - theo mặc định OutputStream thực sự bị đóng khi sử dụng các phương thức ObjectMapper.writeValue() mức cao. Nhưng giải thích tốt về vấn đề thực tế. Bạn có thể vô hiệu hóa tính năng đó ('JsonGenerator.Feature.AUTO_CLOSE_TARGET') trên ObjectMapper, nếu hành vi không mong muốn:' mapper.disable (JsonGenerator.Feature.AUTO_CLOSE_TARGET) ' – StaxMan

+0

Dường như một phiên bản quá tải khác của phương thức vô hiệu hóa sẽ có ích. Hiện tại, không có cái nào có tính năng JsonGenerator.Feature. –

+6

Ok. Vâng, sau đó sẽ có 'mapper.configure (JsonGenerator.Feature.AUTO_CLOSE_TARGET, false)' nhưng được cấp nên thêm các phương thức thuận tiện nếu chúng bị thiếu. – StaxMan

-3

Trong khi tuyên bố tên biến trong các tập tin dữ liệu/file getter của bạn, chữ cái đầu tiên nên nhỏ.

+0

Điều này không thực sự trả lời câu hỏi. Nếu bạn có một câu hỏi khác, bạn có thể hỏi nó bằng cách nhấp vào [Hỏi câu hỏi] (http://stackoverflow.com/questions/ask). Bạn cũng có thể [thêm tiền thưởng] (http://stackoverflow.com/help/privileges/set-bounties) để thu hút thêm sự chú ý đến câu hỏi này khi bạn có đủ [danh tiếng] (http://stackoverflow.com/help/ whats-danh tiếng). –

+0

@JRichardSnape - Tôi không đồng ý. Trong khi câu đầu tiên và chữ ký cần phải đi, thông điệp tổng thể là vấn đề bắt nguồn từ các biến phân biệt chữ hoa chữ thường. Câu trả lời có thể sai, nhưng nó vẫn cố gắng trả lời câu hỏi. – SomethingDark

+0

@SomethingDark Đủ công bằng - Tôi thấy chỉnh sửa của bạn. Tôi đoán có một nỗ lực để trả lời ở đây - có lẽ tôi là một chút nhanh chóng trong hàng đợi xem xét. –