|
26 | 26 | import com.fasterxml.jackson.core.JsonEncoding; |
27 | 27 | import com.fasterxml.jackson.core.JsonGenerator; |
28 | 28 | import com.fasterxml.jackson.core.JsonProcessingException; |
| 29 | +import com.fasterxml.jackson.core.PrettyPrinter; |
| 30 | +import com.fasterxml.jackson.core.util.DefaultIndenter; |
29 | 31 | import com.fasterxml.jackson.core.util.DefaultPrettyPrinter; |
30 | 32 | import com.fasterxml.jackson.databind.JavaType; |
31 | 33 | import com.fasterxml.jackson.databind.JsonMappingException; |
32 | 34 | import com.fasterxml.jackson.databind.ObjectMapper; |
33 | 35 | import com.fasterxml.jackson.databind.ObjectWriter; |
| 36 | +import com.fasterxml.jackson.databind.SerializationConfig; |
34 | 37 | import com.fasterxml.jackson.databind.SerializationFeature; |
35 | 38 | import com.fasterxml.jackson.databind.ser.FilterProvider; |
36 | 39 | import com.fasterxml.jackson.databind.type.TypeFactory; |
@@ -63,27 +66,36 @@ public abstract class AbstractJackson2HttpMessageConverter extends AbstractGener |
63 | 66 |
|
64 | 67 | public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8"); |
65 | 68 |
|
| 69 | + private static final MediaType TEXT_EVENT_STREAM = new MediaType("text", "event-stream"); |
| 70 | + |
66 | 71 |
|
67 | 72 | protected ObjectMapper objectMapper; |
68 | 73 |
|
69 | 74 | private Boolean prettyPrint; |
70 | 75 |
|
| 76 | + private PrettyPrinter ssePrettyPrinter; |
| 77 | + |
71 | 78 |
|
72 | 79 | protected AbstractJackson2HttpMessageConverter(ObjectMapper objectMapper) { |
73 | | - this.objectMapper = objectMapper; |
74 | | - setDefaultCharset(DEFAULT_CHARSET); |
| 80 | + init(objectMapper); |
75 | 81 | } |
76 | 82 |
|
77 | 83 | protected AbstractJackson2HttpMessageConverter(ObjectMapper objectMapper, MediaType supportedMediaType) { |
78 | 84 | super(supportedMediaType); |
79 | | - this.objectMapper = objectMapper; |
80 | | - setDefaultCharset(DEFAULT_CHARSET); |
| 85 | + init(objectMapper); |
81 | 86 | } |
82 | 87 |
|
83 | 88 | protected AbstractJackson2HttpMessageConverter(ObjectMapper objectMapper, MediaType... supportedMediaTypes) { |
84 | 89 | super(supportedMediaTypes); |
| 90 | + init(objectMapper); |
| 91 | + } |
| 92 | + |
| 93 | + protected void init(ObjectMapper objectMapper) { |
85 | 94 | this.objectMapper = objectMapper; |
86 | 95 | setDefaultCharset(DEFAULT_CHARSET); |
| 96 | + DefaultPrettyPrinter prettyPrinter = new DefaultPrettyPrinter(); |
| 97 | + prettyPrinter.indentObjectsWith(new DefaultIndenter(" ", "\ndata:")); |
| 98 | + this.ssePrettyPrinter = prettyPrinter; |
87 | 99 | } |
88 | 100 |
|
89 | 101 |
|
@@ -233,7 +245,8 @@ private Object readJavaType(JavaType javaType, HttpInputMessage inputMessage) { |
233 | 245 | protected void writeInternal(Object object, Type type, HttpOutputMessage outputMessage) |
234 | 246 | throws IOException, HttpMessageNotWritableException { |
235 | 247 |
|
236 | | - JsonEncoding encoding = getJsonEncoding(outputMessage.getHeaders().getContentType()); |
| 248 | + MediaType contentType = outputMessage.getHeaders().getContentType(); |
| 249 | + JsonEncoding encoding = getJsonEncoding(contentType); |
237 | 250 | JsonGenerator generator = this.objectMapper.getFactory().createGenerator(outputMessage.getBody(), encoding); |
238 | 251 | try { |
239 | 252 | writePrefix(generator, object); |
@@ -264,6 +277,11 @@ else if (filters != null) { |
264 | 277 | if (javaType != null && javaType.isContainerType()) { |
265 | 278 | objectWriter = objectWriter.forType(javaType); |
266 | 279 | } |
| 280 | + SerializationConfig config = objectWriter.getConfig(); |
| 281 | + if (contentType != null && contentType.isCompatibleWith(TEXT_EVENT_STREAM) && |
| 282 | + config.isEnabled(SerializationFeature.INDENT_OUTPUT)) { |
| 283 | + objectWriter = objectWriter.with(this.ssePrettyPrinter); |
| 284 | + } |
267 | 285 | objectWriter.writeValue(generator, value); |
268 | 286 |
|
269 | 287 | writeSuffix(generator, object); |
|
0 commit comments