从< String>Spring WebFlux返回Flux返回一个字符串,而不是JSON中的字符串数组

soat7uwm  于 2023-08-04  发布在  Spring
关注(0)|答案(2)|浏览(314)

Spring WebFlux的新功能,尝试在一个端点返回字符串数组,由于某种原因,它返回一个连接的字符串代替JSON数组。
用一些类 Package 它解决了这个问题,但想知道如何实际返回字符串数组?例如,返回Array<String>可以正常工作

class Wrapper(val data: String) {

@RestController
class Test() {
     @RequestMapping("/wrapped") // Returns valid JSON array: [{"value":"Hello"},{"value":"World"}]
     fun b() = Flux.just(Wrapper("Hello"),Wrapper("World"))
     @RequestMapping("/raw") // Returns not valid JSON with just one concatenated string: HelloWorld
     fun a() = Flux.just("Hello", "World")
}

字符串

bvpmtnay

bvpmtnay1#

从Sébastien Deleuze(Spring框架提交者)在Twitter https://twitter.com/sdeleuze/status/956136517348610048中得到了答案
实际上,当元素类型是String时,处理程序方法预期直接提供格式良好的JSON String块,不涉及与Jackson的序列化。

cbwuti44

cbwuti442#

在我的例子中,< String>按照官方spring文档中的建议,用Mono<List >替换Flux并没有立即解决问题。
我调用了以下驻留在不同微服务中的方法:

public Mono<List<String>> getProductIds(String userId) {

    LOG.info("Will get productIds for user with id={}", userId);
    return Mono.fromCallable(() -> getUserProductIds(userId));

 }

 private List<String> getUserProductIds(String userId) {...

字符串
并使用下面的代码进行调用:

public Mono<List<String>> getAssociatedProductIds(String userId) {
    String url = userProductServiceUrl + "/" + userId;

    return webClient.get().uri(url).retrieve().bodyToFlux(String).collectList()
            .onErrorMap(WebClientResponseException.class, ex -> handleException(ex));
}


然而,我得到了像“productId1”,“productId2”这样的返回值,这会在代码中产生问题,因为它被解释为一个有两个字符串的数组:

p.e.m.c.event.services.ProdutcServiceImpl  : getProducts: retrieving events for [%5B%22productId1%22, %22productId2%22%5D]


对此的修复是在webClient构建器中使用bodyToMono并传递ParameterizedTypeReference:

return webClient.get().uri(url).retrieve().bodyToMono(new ParameterizedTypeReference<List<String>>() {})
            .onErrorMap(WebClientResponseException.class, ex -> handleException(ex));

相关问题