diff --git a/spring-web/src/main/java/org/springframework/http/codec/json/AbstractJackson2Encoder.java b/spring-web/src/main/java/org/springframework/http/codec/json/AbstractJackson2Encoder.java index ffeb685568..16cc53b543 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/json/AbstractJackson2Encoder.java +++ b/spring-web/src/main/java/org/springframework/http/codec/json/AbstractJackson2Encoder.java @@ -44,6 +44,7 @@ import org.springframework.core.codec.EncodingException; import org.springframework.core.codec.Hints; import org.springframework.core.io.buffer.DataBuffer; import org.springframework.core.io.buffer.DataBufferFactory; +import org.springframework.core.io.buffer.DataBufferUtils; import org.springframework.core.log.LogFormatUtils; import org.springframework.http.MediaType; import org.springframework.http.codec.HttpMessageEncoder; @@ -161,11 +162,14 @@ public abstract class AbstractJackson2Encoder extends Jackson2CodecSupport imple writer = customizeWriter(writer, mimeType, elementType, hints); DataBuffer buffer = bufferFactory.allocateBuffer(); + boolean release = true; OutputStream outputStream = buffer.asOutputStream(); try { - JsonGenerator generator = getObjectMapper().getFactory().createGenerator(outputStream, encoding); + JsonGenerator generator = + getObjectMapper().getFactory().createGenerator(outputStream, encoding); writer.writeValue(generator, value); + release = false; } catch (InvalidDefinitionException ex) { throw new CodecException("Type definition error: " + ex.getType(), ex); @@ -174,7 +178,13 @@ public abstract class AbstractJackson2Encoder extends Jackson2CodecSupport imple throw new EncodingException("JSON encoding error: " + ex.getOriginalMessage(), ex); } catch (IOException ex) { - throw new IllegalStateException("Unexpected I/O error while writing to data buffer", ex); + throw new IllegalStateException("Unexpected I/O error while writing to data buffer", + ex); + } + finally { + if (release) { + DataBufferUtils.release(buffer); + } } return buffer;