Ensure that JSON is written to response body

Issue: SPR-15988
This commit is contained in:
Andreas Ahlenstorf 2017-09-21 12:19:35 +02:00
parent 15c82afc1c
commit b30f6fd991
2 changed files with 55 additions and 2 deletions

View File

@ -356,7 +356,9 @@ public class ProtobufHttpMessageConverter extends AbstractHttpMessageConverter<M
throws IOException { throws IOException {
if (contentType.isCompatibleWith(APPLICATION_JSON)) { if (contentType.isCompatibleWith(APPLICATION_JSON)) {
this.printer.appendTo(message, new OutputStreamWriter(output, charset)); OutputStreamWriter writer = new OutputStreamWriter(output, charset);
this.printer.appendTo(message, writer);
writer.flush();
} }
else { else {
throw new IOException("protobuf-java-util does not support " + contentType + " format"); throw new IOException("protobuf-java-util does not support " + contentType + " format");

View File

@ -17,8 +17,10 @@
package org.springframework.http.converter.protobuf; package org.springframework.http.converter.protobuf;
import java.io.IOException; import java.io.IOException;
import java.nio.charset.Charset;
import com.google.protobuf.Message; import com.google.protobuf.Message;
import com.google.protobuf.util.JsonFormat;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@ -36,6 +38,7 @@ import static org.mockito.Mockito.*;
* *
* @author Alex Antonov * @author Alex Antonov
* @author Juergen Hoeller * @author Juergen Hoeller
* @author Andreas Ahlenstorf
*/ */
public class ProtobufHttpMessageConverterTests { public class ProtobufHttpMessageConverterTests {
@ -104,7 +107,7 @@ public class ProtobufHttpMessageConverterTests {
} }
@Test @Test
public void write() throws IOException { public void writeProtobuf() throws IOException {
MockHttpOutputMessage outputMessage = new MockHttpOutputMessage(); MockHttpOutputMessage outputMessage = new MockHttpOutputMessage();
MediaType contentType = ProtobufHttpMessageConverter.PROTOBUF; MediaType contentType = ProtobufHttpMessageConverter.PROTOBUF;
this.converter.write(this.testMsg, contentType, outputMessage); this.converter.write(this.testMsg, contentType, outputMessage);
@ -121,6 +124,54 @@ public class ProtobufHttpMessageConverterTests {
assertEquals("sample.proto", schemaHeader); assertEquals("sample.proto", schemaHeader);
} }
@Test
public void writeJsonWithGoogleProtobuf() throws IOException {
this.converter = new ProtobufHttpMessageConverter(
new ProtobufHttpMessageConverter.ProtobufJavaUtilSupport(null, null),
this.registryInitializer);
MockHttpOutputMessage outputMessage = new MockHttpOutputMessage();
MediaType contentType = MediaType.APPLICATION_JSON_UTF8;
this.converter.write(this.testMsg, contentType, outputMessage);
assertEquals(contentType, outputMessage.getHeaders().getContentType());
final String body = outputMessage.getBodyAsString(Charset.forName("UTF-8"));
assertFalse("body is empty", body.isEmpty());
Msg.Builder builder = Msg.newBuilder();
JsonFormat.parser().merge(body, builder);
assertEquals(this.testMsg, builder.build());
assertNull(outputMessage.getHeaders().getFirst(
ProtobufHttpMessageConverter.X_PROTOBUF_MESSAGE_HEADER));
assertNull(outputMessage.getHeaders().getFirst(
ProtobufHttpMessageConverter.X_PROTOBUF_SCHEMA_HEADER));
}
@Test
public void writeJsonWithJavaFormat() throws IOException {
this.converter = new ProtobufHttpMessageConverter(
new ProtobufHttpMessageConverter.ProtobufJavaFormatSupport(),
this.registryInitializer);
MockHttpOutputMessage outputMessage = new MockHttpOutputMessage();
MediaType contentType = MediaType.APPLICATION_JSON_UTF8;
this.converter.write(this.testMsg, contentType, outputMessage);
assertEquals(contentType, outputMessage.getHeaders().getContentType());
final String body = outputMessage.getBodyAsString(Charset.forName("UTF-8"));
assertFalse("body is empty", body.isEmpty());
Msg.Builder builder = Msg.newBuilder();
JsonFormat.parser().merge(body, builder);
assertEquals(this.testMsg, builder.build());
assertNull(outputMessage.getHeaders().getFirst(
ProtobufHttpMessageConverter.X_PROTOBUF_MESSAGE_HEADER));
assertNull(outputMessage.getHeaders().getFirst(
ProtobufHttpMessageConverter.X_PROTOBUF_SCHEMA_HEADER));
}
@Test @Test
public void defaultContentType() throws Exception { public void defaultContentType() throws Exception {
assertEquals(ProtobufHttpMessageConverter.PROTOBUF, this.converter.getDefaultContentType(this.testMsg)); assertEquals(ProtobufHttpMessageConverter.PROTOBUF, this.converter.getDefaultContentType(this.testMsg));