簡體   English   中英

Spring 反應性操作 Object 在返回給客戶端之前

[英]Spring Reactive manipulating Object before returning it to Client

我必須調用 URL 來返回這個 JSON output

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

我的目標是返回一個帶有 Boolean 值的 POJO,例如

zone1: true Zone2: true 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 操作 output 並返回一個新的 Object?

首先你有這個回應

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

所以這可以從 Jackson 映射到以下自定義 object

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

}

然后,您可以將這個 map 用於您實際想要返回的另一個 object。 你定義的那個

@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將您收到的響應轉換為您想要從 controller 回饋的響應

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;
                });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM