Spring Reactive WebFlux中如何从ServerRequest提取字符串数组
问题根因
原代码调用bodyToMono(String.class)时,Spring WebFlux会把整个请求的JSON数组直接反序列化为单个字符串对象,因此得到的是带转义符的整串JSON,而非拆分后的字符串集合。
修复实现
Spring WebFlux原生支持请求体直接反序列化为集合/数组类型,有两种常用实现方式:
方式1:直接反序列化为字符串数组(写法更简洁)
如果可以接受先拿到数组再转List,直接指定反序列化类型为String[].class即可:
import java.util.Arrays; import java.util.List; import reactor.core.publisher.Mono; import org.springframework.http.MediaType; import org.springframework.web.reactive.function.server.ServerRequest; import org.springframework.web.reactive.function.server.ServerResponse; public Mono<ServerResponse> getArray(ServerRequest serverRequest) { return serverRequest // 直接将JSON数组反序列化为字符串数组 .bodyToMono(String[].class) // 转换为List<String>,此处可插入你的业务逻辑处理 .map(Arrays::asList) .flatMap(stringList -> ServerResponse.ok() .contentType(MediaType.APPLICATION_JSON) // 这里直接返回List前端会收到标准JSON数组,无额外转义 .bodyValue(stringList) ); }
方式2:直接反序列化为List(适配泛型场景)
如果需要直接拿到List类型,用ParameterizedTypeReference处理泛型擦除问题即可:
import java.util.List; import reactor.core.publisher.Mono; import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.MediaType; import org.springframework.web.reactive.function.server.ServerRequest; import org.springframework.web.reactive.function.server.ServerResponse; public Mono<ServerResponse> getArray(ServerRequest serverRequest) { return serverRequest // 借助ParameterizedTypeReference保留泛型信息,直接反序列化为List<String> .bodyToMono(new ParameterizedTypeReference<List<String>>() {}) // 此处拿到的stringList就是你需要的类型,直接传入业务逻辑即可 .flatMap(stringList -> ServerResponse.ok() .contentType(MediaType.APPLICATION_JSON) .bodyValue(stringList) ); }
验证说明
两种方式处理后,你拿到的集合对象已经是拆分好的List<String>,返回给前端时也会输出标准JSON数组["123","456"],不会出现额外转义符。
内容的提问来源于stack exchange,提问作者Shiva kumar
相关产品推荐
相关产品推荐

