我正在为我的 spring-boot 应用程序使用 WebClient
和自定义 BodyExtractor
类
WebClient webLCient = WebClient.create();
webClient.get()
.uri(url, params)
.accept(MediaType.APPLICATION.XML)
.exchange()
.flatMap(response -> {
return response.body(new BodyExtractor());
})
BodyExtractor.java
@Override
public Mono<T> extract(ClientHttpResponse response, BodyExtractor.Context context) {
Flux<DataBuffer> body = response.getBody();
body.map(dataBuffer -> {
try {
JaxBContext jc = JaxBContext.newInstance(SomeClass.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
return (T) unmarshaller.unmarshal(dataBuffer.asInputStream())
} catch(Exception e){
return null;
}
}).next();
}
上面的代码适用于小有效载荷但不适用于大有效载荷,我认为这是因为我只读取一个通量值 next
我不确定如何组合和读取所有 dataBuffer
。
我是反应堆的新手,所以我不知道通量/单声道的很多技巧。
原文由 Bk Santiago 发布,翻译遵循 CC BY-SA 4.0 许可协议
我能够通过使用
Flux#collect
和SequenceInputStream
使其工作InputStreamCollector.java