当前位置: 首页 > 面试题库 >

如何正确阅读助焊剂 并将其转换为单个inputStream

田玉韵
2023-03-14
问题内容

我正在为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

我是电抗器的新手,所以我对通量/单声道不了解很多技巧。


问题答案:

我能够通过使用Flux#collect和使它工作SequenceInputStream

@Override
public Mono<T> extract(ClientHttpResponse response, BodyExtractor.Context context) {
  Flux<DataBuffer> body = response.getBody();
  return body.collect(InputStreamCollector::new, (t, dataBuffer)-> t.collectInputStream(dataBuffer.asInputStream))
    .map(inputStream -> {
      try {
        JaxBContext jc = JaxBContext.newInstance(SomeClass.class);
        Unmarshaller unmarshaller = jc.createUnmarshaller();

        return (T) unmarshaller.unmarshal(inputStream);
      } catch(Exception e){
        return null;
      }
  }).next();
}

InputStreamCollector.java

public class InputStreamCollector {
  private InputStream is;

  public void collectInputStream(InputStream is) {
    if (this.is == null) this.is = is;
    this.is = new SequenceInputStream(this.is, is);
  }

  public InputStream getInputStream() {
    return this.is;
  }
}


 类似资料:
  • 问题内容: 我正在将用RxJava 1.x编写的小项目转换为Reactor3.x。一切都很好,除了我找不到如何用合适的替代品代替。我有,我需要将其转换为。 问题答案: 在Reactor 3中,根据原始来源(数组,可迭代等),运算符被专门化为几个变体。 在您的情况下使用。

  • 我有下面的反应代码使用通量在反应堆核心: 正如您所看到的,对于我的流程的外部源(FluxSink.OverflowStrategy.Latest),我对此进行了背压处理。但是,我还想为我的进程配置redis(redishashreactiveCommands.hmset(key,map))的背压,因为它对我的进程来说可能是一个比外部源更大的瓶颈。我希望我需要为redis部分创建另一个flux并将它

  • 问题内容: 我有一个MonoA。对象A包含两个列表。我想直接创建两个助焊剂。没有block(),这可能吗? 问题答案: 使用Mono.flatMapMany()方法:

  • 我对字符串列表进行了一些数据转换,得到了一个列表,其中左表示错误,右表示成功转换的项。 我将结果划分为: 做了一些错误处理后,我想返回有效项目的。这意味着,返回所有右元素的值。由于分区,我已经知道项目的所有元素。我想出了五种可能的方法。但是易读性和性能最好的是什么?在Scala中有没有惯用的方法?

  • 问题内容: 我想播放现在以JSON格式保存的数据。但是我对R非常陌生,对如何处理数据一无所知。您可以在下面看到我设法实现的目标。但首先,我的代码: 我能够得到数据: 尽管输出看起来很原始: 请注意,JSON有点嵌套。我可以使用Python创建表,但是R似乎要复杂得多。 编辑: 我的JSON: 问题答案: 返回一个列表,您可以使用函数来遍历每个元素。将其转换为“表”非常简单(一旦您知道该怎么做!)(