我有一個 Spring Boot 應用程式,其中有一個端點,當被點擊時,它會回傳一個字串串列。我還有另一個 spring boot 應用程式,它會點擊第一個應用程式的端點來獲取資料。獲取代碼:
return webClient.get().uri("/sensors/get-cities").headers(httpHeaders -> {
httpHeaders.set("Authorization", auth);
}).retrieve()
.bodyToFlux(String.class).collectList().block();
上面產生了一個串列,但是當我在除錯器中檢查它時使用這種格式,"["city"]". 外部雙引號,我得到它們是因為它是一個字串,但括號和內部雙引號,我沒有。我嘗試替換這些字符,但我對括號沒有運氣(嘗試過正則運算式)。就好像他們不在那里,但同時他們也在。在這一點上我很困惑。但我認為獲取代碼的行為不正常,它應該產生一個有效的字串陣列。
uj5u.com熱心網友回復:
你可能得到的(我在這里猜)是一個看起來像這樣的回應體:
[
"New York",
"Madrid",
"London"
]
然后你告訴 webflux 你想通過呼叫將 body 轉換為 a Fluxof 。StringbodyToFlux(String.class)
所以框架獲取整個回應并從中生成一個字串
// A string of the entire array (im escaping the quotation marks)
"[\"New York\",\"Madrid\",\"London\"]"
然后框架會將整個事物放入 aFlux中,這意味著它在Flux. List然后,您通過呼叫將所有值發送到 acollectList等效代碼是:
List<String> oneString = Flux.just("[\"New York\",\"Madrid\",\"London\"]")
.collectList()
.block();
所以你得到一個串列,里面有一個字串,它是整個身體。
您可能想要做的是列出一個串列。這是一種方法:
List<String> strings = webClient.get()
.uri("/sensors/get-cities")
.headers(httpHeaders -> {
httpHeaders.set("Authorization", auth);
})
.retrieve()
.bodyToMono(new ParameterizedTypeReference<List<String>>() {})
.block();
春天解釋說ParameterizedTypeReference:
此類的目的是啟用捕獲和傳遞泛型型別。為了捕獲泛型型別并在運行時保留它
所以它是一種確保我們可以使用泛型型別List<T>并幫助我們處理型別資訊的類。
所以我們現在要做的是獲取回應并直接告訴框架正文是字串串列。我們不需要再做collectList,因為框架會為我們把它放在一個串列中。然后我們呼叫block等待回應。
uj5u.com熱心網友回復:
您的 Springboot API 回傳決議為 JSON 的結果(這是默認行為)。因此,它首先構建一個字串串列(在您的情況下只是一個字串"city",然后將其序列化為 Json。在這種情況下,由于它是一個串列,因此它會將其序列化為 JSON 陣列而不是 JSON 物件。在此處閱讀有關 JSON 的資訊。所以在您的第二個 Springboot 應用程式從第一個應用程式訪問 API 應該假設您正在獲取 JSON,您需要對其進行決議以獲取您的串列。要決議它,您可以使用Json Jackson 庫類的readValue()方法,ObjectMapper這是默認的 JSON Springboot 中的庫。您的代碼將是
List<String> myList;
ObjectMapper = new ObjectMapper();
//Add setters for ObjectMapper configuration here if you want a specific config
try {
myList = objectMapper.readValue(myJsonString, List.class);
} catch(IOException ioe) {
...
}
此外,我還撰寫了自己的開源庫 MgntUtils,其中包括JsonUtils一個類,它是 Json Jackson 庫的薄包裝器。它只提供 Json 決議器和序列化器,但在許多情況下,這就是您所需要的。使用我的庫,您只需要一個與杰克遜相反的依賴項,并且JsonUtils類只有 4 種方法,因此更容易理解。但是在您的情況下,如果您使用我的庫,則代碼將與上述代碼非常相似。它會是這樣的:
List<String> myList;
try {
myList = JsonUtils.readObjectFromJsonString(myJsonString, List.class);
} catch(IOException ioe) {
...
}
請注意,在這種情況下,您不必像靜態方法那樣實體化和配置ObjectMapper實體。readObjectFromJsonString無論如何,如果您有興趣使用我的庫,您可以在這里找到 maven 工件,帶有源代碼和 javadoc 的庫本身位于 Github上。JsonUtils類的Javadoc在這里
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/459165.html
標籤:爪哇 春天 列表 弹簧靴 spring-webflux
