Java程序在ObjectMapper.writeValue(System.out,responseData)之后终止 - 杰克逊图书馆

gsi*_*011 16 java json terminate jackson

我正在使用Jackson库创建JSON对象,但是当我使用mapper.writeValue(System.out,responseData)函数时,程序终止.这是我的代码:

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

}
Run Code Online (Sandbox Code Playgroud)

执行此操作后,控制台显示{"id":1},但不显示"已完成".

Pro*_*uce 17

问题在于Jackson实现,因为ObjectMapper._configAndWriteValue调用UtfGenerator.close(),它调用PrintStream.close().

我将在https://jira.codehaus.org/browse/JACKSON上记录一个问题

要更改目标被关闭的默认行为,您可以执行以下操作:

mapper.configure(JsonGenerator.Feature.AUTO_CLOSE_TARGET, false);
Run Code Online (Sandbox Code Playgroud)

  • 好.是的,应该有`mapper.configure(JsonGenerator.Feature.AUTO_CLOSE_TARGET,false)`但是如果它们丢失,也应该添加方便方法. (6认同)
  • 是的,`mapper.configure(JsonGenerator.Feature.AUTO_CLOSE_TARGET,false);`做了诀窍. (4认同)
  • 它不是一个bug,它的功能 - 默认情况下,当使用高级ObjectMapper.writeValue()方法时,OutputStream确实已关闭.但对实际问题有很好的解释.如果不需要行为,可以在ObjectMapper上禁用该功能(`JsonGenerator.Feature.AUTO_CLOSE_TARGET`):`mapper.disable(JsonGenerator.Feature.AUTO_CLOSE_TARGET)` (3认同)
  • 我会记录一个问题并要求对其进行更改。调用者创建了流,因此应该拥有它的生命周期。可怕的API。 (2认同)