Questo errore è presente nelle versioni 1.7 e 1.8 più recenti di JDK (7u72, 8u25). Richiesto: jackson-databind 2.5.0. Testato su Linux x86_64 (Ubuntu 14.10 per la precisione).Bug nel file system zip JDK di Oracle, come si scrive un SSCCE per riprodurlo?
Codice:
public static void main(final String... args)
throws IOException
{
final Map<String, String> map
= Collections.singletonMap("create", "true");
final Path zipfile = Paths.get("/tmp/foo.zip");
Files.deleteIfExists(zipfile);
final URI uri = URI.create("jar:" + zipfile.toUri());
final ObjectMapper mapper = new ObjectMapper();
try (
final FileSystem zipfs = FileSystems.newFileSystem(uri, map);
final OutputStream out
= Files.newOutputStream(zipfs.getPath("/t.json"));
) {
mapper.writeValue(out, "hello");
}
}
Questo produce un file non valido zip:
$ unzip /tmp/foo.zip
Archive: /tmp/foo.zip
replace t.json? [y]es, [n]o, [A]ll, [N]one, [r]ename: A
inflating: t.json
error: invalid compressed data to inflate
ho originariamente aperto il bug su Jackson issue tracker, anche se in realtà non è il colpevole qui, e una soluzione è stato trovato per aggirare il problema: disabilitare JsonGenerator.Feature.AUTO_CLOSE_SOURCE
nel ObjectMapper
. Questa opzione che è abilitata di default dice al mapper di chiudere il flusso.
Mentre mi piacerebbe aprire il bug su Oracle, vorrei prima essere in grado di scrivere un SSCCE, ma non posso. Ho provato a chiudere lo stream due volte (poiché è stato chiuso due volte nell'esempio), a non utilizzare un'istruzione try-with-resources, ecc., Ma inutilmente.
Si può venire con un SSCCE per questo problema?
potrei esaminare la dimensione di ciò che è scritto la zip. E dai uno sguardo molto attento alla fonte per scoprire i possibili luoghi che potrebbero rompersi. – kdgregory
Inoltre, prova a creare un decoratore 'OutputStream' che gira quando' close() 'viene chiamato due volte. – kdgregory
Perché Jackson non è il cuplrit? – EJP