【问题标题】:Spring Reactive manipulating Object before returning it to ClientSpring Reactive 在将对象返回给客户端之前对其进行操作
【发布时间】:2021-08-10 04:37:53
【问题描述】:

我必须调用一个返回此 JSON 输出的 URL

{
    "zonesList": [
        "zone1",
        "zone2",
        "zone5",
        "zone4"
    ]
}

我的目标是返回一个带有布尔值的 POJO,例如

zone1: 真 区域 2:真 zone3: false(因为 zone3 不在输出中)

我创建了 2 个这样的 pojo

@Data
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class ZonesList {
    public ZoneActiveContentResponseModel zonesList;
}

@Data
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class ZoneActiveContentResponseModel  {

   
    public Boolean zone1 = false;
    public Boolean zone2 = false;
    public Boolean zone3 = false;
    public Boolean zone4 = false;
    public Boolean zone5 = false;
}

我想退回 Mono 但我不知道如何退回它,这就是我现在拥有的

Mono<ZonesList> zoneList = webClient
                .get()
                .uri(apiPath)
                .accept(MediaType.APPLICATION_JSON)
                .retrieve().bodyToMono(ZonesList.class)
                .onErrorResume(throwable -> {
                    log.error("Received error response from GET zone fragment Api [{}]", throwable);
                    ZoneActiveContentResponseModel errorModel = new ZoneActiveContentResponseModel();
                  //  errorModel.setErrors(prepareErrorObject(throwable));
                  //  return Mono.just(errorModel);
                    return null;
                });

所以我的问题是如何操作来自 webclient 的输出并返回一个新对象?

【问题讨论】:

  • 是否总是只有这 5 个区域可用?还是说zone6也来了?
  • 始终是 5 个区域。如果响应中没有区域,我们必须返回 false

标签: spring spring-boot reactive-programming spring-webflux


【解决方案1】:

收到此回复的第一件事

{
    "zonesList": [
        "zone1",
        "zone2",
        "zone5",
        "zone4"
    ]
}

所以这可以映射到杰克逊的以下自定义对象中

@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public class ZonesList {
  
  private List<String> zonesList;

}

然后您可以使用这个将其映射到您实际想要返回的另一个对象。你定义的那个

@Data
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class ZoneActiveContentResponseModel  {

   
    public Boolean zone1 = false;
    public Boolean zone2 = false;
    public Boolean zone3 = false;
    public Boolean zone4 = false;
    public Boolean zone5 = false;
}

然后您使用.map 将您收到的响应转换为您想要从控制器返回的响应

Mono<ZonesList> zoneList = webClient

                .get()
                .uri(apiPath)
                .accept(MediaType.APPLICATION_JSON)
                .retrieve().bodyToMono(ZonesList.class)
                .map (el -> 
new ZoneActiveContentResponseModel( el.getZonesList.contains("zone1"),
                                    el.getZonesList.contains("zone2"),
                                    el.getZonesList.contains("zone3"),
                                    el.getZonesList.contains("zone4"),
                                    el.getZonesList.contains("zone5")) )
                .onErrorResume(throwable -> {
                    log.error("Received error response from GET zone fragment Api [{}]", throwable);
                    ZoneActiveContentResponseModel errorModel = new ZoneActiveContentResponseModel();
                  //  errorModel.setErrors(prepareErrorObject(throwable));
                  //  return Mono.just(errorModel);
                    return null;
                });

【讨论】:

  • 感谢博格的帮助
猜你喜欢
  • 2011-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多