统一处理响应

ResponseBodyResultHandler 是 Spring WebFlux 中用于处理返回结果的类,它的作用是将返回结果转换为 ServerHttpResponse 可以处理的类型,然后写入到响应中。我们可以通过继承 ResponseBodyResultHandler 来实现自定义的返回结果处理器。只需要重写 handleResult 方法即可。

@Slf4j
public class GlobalResponseBodyHandler extends ResponseBodyResultHandler {
    public GlobalResponseBodyHandler(List<HttpMessageWriter<?>> writers, RequestedContentTypeResolver resolver) {
        super(writers, resolver);
    }

    @Override
    @NonNull
    public Mono<Void> handleResult(@NonNull ServerWebExchange exchange, @NonNull HandlerResult result) {
        ReactiveAdapter adapter = getAdapter(result);
        if (adapter != null) {
            // 如果返回结果是 Mono 类型,则进行处理
            Mono<Map<String, Object>> body = ((Mono<?>) Objects.requireNonNull(result.getReturnValue())).map(data -> {
                Map<String, Object> map = new HashMap<>();
                map.put("data", data);
                map.put("code", 200);
                map.put("message", "success");
                return map;
            });
            return writeBody(body, result.getReturnTypeSource().nested(), exchange);
        } else {
            Map<String, Object> map = new HashMap<>();
            map.put("data", result.getReturnValue());
            map.put("code", 200);
            map.put("message", "success");
            return writeBody(Mono.just(map), result.getReturnTypeSource().nested(), exchange);
        }
    }
}
@Bean
public GlobalResponseBodyHandler responseWrapper(ServerCodecConfigurer serverCodecConfigurer, RequestedContentTypeResolver requestedContentTypeResolver) {
    return new GlobalResponseBodyHandler(serverCodecConfigurer.getWriters(), requestedContentTypeResolver);
}

最后更新于

这有帮助吗?