|
|
|
@ -104,7 +104,6 @@ public abstract class AbstractJackson2Encoder extends Jackson2CodecSupport imple |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public boolean canEncode(ResolvableType elementType, @Nullable MimeType mimeType) { |
|
|
|
public boolean canEncode(ResolvableType elementType, @Nullable MimeType mimeType) { |
|
|
|
Class<?> clazz = elementType.toClass(); |
|
|
|
|
|
|
|
if (!supportsMimeType(mimeType)) { |
|
|
|
if (!supportsMimeType(mimeType)) { |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
@ -114,6 +113,11 @@ public abstract class AbstractJackson2Encoder extends Jackson2CodecSupport imple |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
ObjectMapper mapper = selectObjectMapper(elementType, mimeType); |
|
|
|
|
|
|
|
if (mapper == null) { |
|
|
|
|
|
|
|
return false; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
Class<?> clazz = elementType.toClass(); |
|
|
|
if (String.class.isAssignableFrom(elementType.resolve(clazz))) { |
|
|
|
if (String.class.isAssignableFrom(elementType.resolve(clazz))) { |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
@ -121,11 +125,11 @@ public abstract class AbstractJackson2Encoder extends Jackson2CodecSupport imple |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
if (!logger.isDebugEnabled()) { |
|
|
|
if (!logger.isDebugEnabled()) { |
|
|
|
return getObjectMapper().canSerialize(clazz); |
|
|
|
return mapper.canSerialize(clazz); |
|
|
|
} |
|
|
|
} |
|
|
|
else { |
|
|
|
else { |
|
|
|
AtomicReference<Throwable> causeRef = new AtomicReference<>(); |
|
|
|
AtomicReference<Throwable> causeRef = new AtomicReference<>(); |
|
|
|
if (getObjectMapper().canSerialize(clazz, causeRef)) { |
|
|
|
if (mapper.canSerialize(clazz, causeRef)) { |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
logWarningIfNecessary(clazz, causeRef.get()); |
|
|
|
logWarningIfNecessary(clazz, causeRef.get()); |
|
|
|
@ -150,10 +154,14 @@ public abstract class AbstractJackson2Encoder extends Jackson2CodecSupport imple |
|
|
|
byte[] separator = getStreamingMediaTypeSeparator(mimeType); |
|
|
|
byte[] separator = getStreamingMediaTypeSeparator(mimeType); |
|
|
|
if (separator != null) { // streaming
|
|
|
|
if (separator != null) { // streaming
|
|
|
|
try { |
|
|
|
try { |
|
|
|
ObjectWriter writer = createObjectWriter(elementType, mimeType, null, hints); |
|
|
|
ObjectMapper mapper = selectObjectMapper(elementType, mimeType); |
|
|
|
|
|
|
|
if (mapper == null) { |
|
|
|
|
|
|
|
throw new IllegalStateException("No ObjectMapper for " + elementType); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
ObjectWriter writer = createObjectWriter(mapper, elementType, mimeType, null, hints); |
|
|
|
ByteArrayBuilder byteBuilder = new ByteArrayBuilder(writer.getFactory()._getBufferRecycler()); |
|
|
|
ByteArrayBuilder byteBuilder = new ByteArrayBuilder(writer.getFactory()._getBufferRecycler()); |
|
|
|
JsonEncoding encoding = getJsonEncoding(mimeType); |
|
|
|
JsonEncoding encoding = getJsonEncoding(mimeType); |
|
|
|
JsonGenerator generator = getObjectMapper().getFactory().createGenerator(byteBuilder, encoding); |
|
|
|
JsonGenerator generator = mapper.getFactory().createGenerator(byteBuilder, encoding); |
|
|
|
SequenceWriter sequenceWriter = writer.writeValues(generator); |
|
|
|
SequenceWriter sequenceWriter = writer.writeValues(generator); |
|
|
|
|
|
|
|
|
|
|
|
return Flux.from(inputStream) |
|
|
|
return Flux.from(inputStream) |
|
|
|
@ -188,6 +196,10 @@ public abstract class AbstractJackson2Encoder extends Jackson2CodecSupport imple |
|
|
|
public DataBuffer encodeValue(Object value, DataBufferFactory bufferFactory, |
|
|
|
public DataBuffer encodeValue(Object value, DataBufferFactory bufferFactory, |
|
|
|
ResolvableType valueType, @Nullable MimeType mimeType, @Nullable Map<String, Object> hints) { |
|
|
|
ResolvableType valueType, @Nullable MimeType mimeType, @Nullable Map<String, Object> hints) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ObjectMapper mapper = selectObjectMapper(valueType, mimeType); |
|
|
|
|
|
|
|
if (mapper == null) { |
|
|
|
|
|
|
|
throw new IllegalStateException("No ObjectMapper for " + valueType); |
|
|
|
|
|
|
|
} |
|
|
|
Class<?> jsonView = null; |
|
|
|
Class<?> jsonView = null; |
|
|
|
FilterProvider filters = null; |
|
|
|
FilterProvider filters = null; |
|
|
|
if (value instanceof MappingJacksonValue) { |
|
|
|
if (value instanceof MappingJacksonValue) { |
|
|
|
@ -196,7 +208,7 @@ public abstract class AbstractJackson2Encoder extends Jackson2CodecSupport imple |
|
|
|
jsonView = container.getSerializationView(); |
|
|
|
jsonView = container.getSerializationView(); |
|
|
|
filters = container.getFilters(); |
|
|
|
filters = container.getFilters(); |
|
|
|
} |
|
|
|
} |
|
|
|
ObjectWriter writer = createObjectWriter(valueType, mimeType, jsonView, hints); |
|
|
|
ObjectWriter writer = createObjectWriter(mapper, valueType, mimeType, jsonView, hints); |
|
|
|
if (filters != null) { |
|
|
|
if (filters != null) { |
|
|
|
writer = writer.with(filters); |
|
|
|
writer = writer.with(filters); |
|
|
|
} |
|
|
|
} |
|
|
|
@ -206,7 +218,7 @@ public abstract class AbstractJackson2Encoder extends Jackson2CodecSupport imple |
|
|
|
|
|
|
|
|
|
|
|
logValue(hints, value); |
|
|
|
logValue(hints, value); |
|
|
|
|
|
|
|
|
|
|
|
try (JsonGenerator generator = getObjectMapper().getFactory().createGenerator(byteBuilder, encoding)) { |
|
|
|
try (JsonGenerator generator = mapper.getFactory().createGenerator(byteBuilder, encoding)) { |
|
|
|
writer.writeValue(generator, value); |
|
|
|
writer.writeValue(generator, value); |
|
|
|
generator.flush(); |
|
|
|
generator.flush(); |
|
|
|
} |
|
|
|
} |
|
|
|
@ -282,20 +294,18 @@ public abstract class AbstractJackson2Encoder extends Jackson2CodecSupport imple |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private ObjectWriter createObjectWriter(ResolvableType valueType, @Nullable MimeType mimeType, |
|
|
|
private ObjectWriter createObjectWriter( |
|
|
|
|
|
|
|
ObjectMapper mapper, ResolvableType valueType, @Nullable MimeType mimeType, |
|
|
|
@Nullable Class<?> jsonView, @Nullable Map<String, Object> hints) { |
|
|
|
@Nullable Class<?> jsonView, @Nullable Map<String, Object> hints) { |
|
|
|
|
|
|
|
|
|
|
|
JavaType javaType = getJavaType(valueType.getType(), null); |
|
|
|
JavaType javaType = getJavaType(valueType.getType(), null); |
|
|
|
if (jsonView == null && hints != null) { |
|
|
|
if (jsonView == null && hints != null) { |
|
|
|
jsonView = (Class<?>) hints.get(Jackson2CodecSupport.JSON_VIEW_HINT); |
|
|
|
jsonView = (Class<?>) hints.get(Jackson2CodecSupport.JSON_VIEW_HINT); |
|
|
|
} |
|
|
|
} |
|
|
|
ObjectWriter writer = (jsonView != null ? |
|
|
|
ObjectWriter writer = (jsonView != null ? mapper.writerWithView(jsonView) : mapper.writer()); |
|
|
|
getObjectMapper().writerWithView(jsonView) : getObjectMapper().writer()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (javaType.isContainerType()) { |
|
|
|
if (javaType.isContainerType()) { |
|
|
|
writer = writer.forType(javaType); |
|
|
|
writer = writer.forType(javaType); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return customizeWriter(writer, mimeType, valueType, hints); |
|
|
|
return customizeWriter(writer, mimeType, valueType, hints); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|