jackson-javax-json
jackson-javax-json copied to clipboard
NullPointerException on trying to write to JsonGenerator after close()
Version: 0.9.0 from maven JAR
It would be good to throw a more descriptive exception when someone tries to write to a JsonGenerator instance after closing it. Here's a test case:
package test.javax.json;
import com.github.pgelinas.jackson.javax.json.stream.JacksonGeneratorFactory;
import org.junit.Before;
import org.junit.Test;
import org.skyscreamer.jsonassert.JSONAssert;
import java.io.StringWriter;
import java.io.Writer;
import java.util.HashMap;
import javax.json.stream.JsonGenerator;
import javax.json.stream.JsonGeneratorFactory;
public class ExploratoryTest2 {
private JsonGeneratorFactory factory;
private Writer writer;
private JsonGenerator json;
@Before
public void setUp() {
factory = new JacksonGeneratorFactory(new HashMap<String, Boolean>());
writer = new StringWriter();
json = factory.createGenerator(writer);
}
@Test
public void testMultipleFactoryCalls() throws Exception {
String expected1 =
"[\n"
+ " {\n"
+ " \"trueField\":true\n"
+ " }\n"
+ "]\n";
json.writeStartArray()
.writeStartObject()
.write("trueField", true)
.close();
String actual1 = writer.toString();
JSONAssert.assertEquals(expected1, actual1, true);
String expected2 =
"[\n"
+ " {\n"
+ " \"falseField\":false\n"
+ " }\n"
+ "]\n";
// uncomment these lines to make it pass:
// writer = new StringWriter();
// json = factory.createGenerator(writer);
json.writeStartArray()
.writeStartObject()
.write("falseField", false)
.close();
String actual2 = writer.toString();
JSONAssert.assertEquals(expected2, actual2, true);
}
}
Current stacktrace:
java.lang.NullPointerException
at java.lang.System.arraycopy(Native Method)
at java.lang.String.getChars(String.java:826)
at com.fasterxml.jackson.core.json.WriterBasedJsonGenerator.writeRaw(WriterBasedJsonGenerator.java:416)
at com.fasterxml.jackson.core.json.WriterBasedJsonGenerator._verifyValueWrite(WriterBasedJsonGenerator.java:778)
at com.fasterxml.jackson.core.json.WriterBasedJsonGenerator.writeStartArray(WriterBasedJsonGenerator.java:127)
at com.github.pgelinas.jackson.javax.json.stream.JacksonGenerator.writeStartArray(JacksonGenerator.java:49)
at co.tmol.json.ExploratoryTest2.testMultipleFactoryCalls(ExploratoryTest2.java:58)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at ...
We'd expect to see something like this instead:
throw new JsonGenerationException("attempted illegal write after close()");