Skip to content

Commit b01b662

Browse files
committed
Added decode methods
1 parent c785c79 commit b01b662

File tree

1 file changed

+37
-0
lines changed

1 file changed

+37
-0
lines changed

src/main/java/org/springframework/data/web/ProjectingJackson2JsonDecoder.java

+37
Original file line numberDiff line numberDiff line change
@@ -15,23 +15,31 @@
1515
*/
1616
package org.springframework.data.web;
1717

18+
import com.fasterxml.jackson.databind.DeserializationFeature;
1819
import com.fasterxml.jackson.databind.JavaType;
1920
import com.fasterxml.jackson.databind.ObjectMapper;
2021
import com.jayway.jsonpath.spi.json.JacksonJsonProvider;
2122
import com.jayway.jsonpath.spi.mapper.JacksonMappingProvider;
23+
import org.reactivestreams.Publisher;
2224
import org.springframework.beans.BeansException;
2325
import org.springframework.beans.factory.BeanClassLoaderAware;
2426
import org.springframework.beans.factory.BeanFactory;
2527
import org.springframework.beans.factory.BeanFactoryAware;
2628
import org.springframework.core.ResolvableType;
2729
import org.springframework.core.annotation.AnnotationUtils;
30+
import org.springframework.core.codec.DecodingException;
31+
import org.springframework.core.io.buffer.DataBuffer;
32+
import org.springframework.core.io.buffer.DataBufferUtils;
2833
import org.springframework.data.projection.SpelAwareProxyProjectionFactory;
2934
import org.springframework.http.codec.json.Jackson2JsonDecoder;
3035
import org.springframework.lang.Nullable;
3136
import org.springframework.util.Assert;
3237
import org.springframework.util.ConcurrentReferenceHashMap;
3338
import org.springframework.util.MimeType;
39+
import reactor.core.publisher.Flux;
40+
import reactor.core.publisher.Mono;
3441

42+
import java.math.BigDecimal;
3543
import java.util.Map;
3644
import java.util.concurrent.atomic.AtomicReference;
3745

@@ -129,4 +137,33 @@ public boolean canDecode(ResolvableType elementType, @Nullable MimeType mimeType
129137
}
130138
}
131139

140+
@Override
141+
public Flux<Object> decode(Publisher<DataBuffer> input, ResolvableType elementType,
142+
@Nullable MimeType mimeType, @Nullable Map<String, Object> hints) {
143+
144+
ObjectMapper mapper = selectObjectMapper(elementType, mimeType);
145+
if (mapper == null) {
146+
throw new IllegalStateException("No ObjectMapper for " + elementType);
147+
}
148+
149+
Flux<DataBuffer> processed = processInput(input, elementType, mimeType, hints);
150+
151+
return DataBufferUtils.join(processed, this.getMaxInMemorySize())
152+
.flatMap(dataBuffer -> Mono.just(decode(dataBuffer, elementType, mimeType, hints)))
153+
.expand(object -> {
154+
if (object instanceof Iterable) {
155+
return Flux.fromIterable((Iterable) object);
156+
}
157+
return Flux.just(object);
158+
});
159+
}
160+
161+
@Override
162+
public Object decode(DataBuffer dataBuffer, ResolvableType targetType,
163+
@Nullable MimeType mimeType, @Nullable Map<String, Object> hints) throws DecodingException {
164+
165+
return projectionFactory.createProjection(ResolvableType.forType(targetType.getType()).resolve(Object.class),
166+
dataBuffer.asInputStream());
167+
}
168+
132169
}

0 commit comments

Comments
 (0)