gpt4 book ai didi

spring - Webflux 还不支持 ResponseBodyAdvice?

转载 作者:行者123 更新时间:2023-12-01 04:43:38 25 4
gpt4 key购买 nike

由于 ResponseBodyAdvice 接口(interface)在 web.servlet 包中
我如何在 webflux 中实现这样的功能?

最佳答案

我也有这个问题,发现可以通过HandlerResultHandler来解决。

例如,我扩展 ResponseBodyResultHandler包装我所有的回复

首先,你应该写ResponseWrapper.java

public class ResponseWrapper extends ResponseBodyResultHandler {
private static MethodParameter param;

static {
try {
//get new params
param = new MethodParameter(ResponseWrapper.class
.getDeclaredMethod("methodForParams"), -1);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}

public ResponseWrapper(List<HttpMessageWriter<?>> writers, RequestedContentTypeResolver resolver) {
super(writers, resolver);
}

private static Mono<Response> methodForParams() {
return null;
}

@Override
public boolean supports(HandlerResult result) {
boolean isMono = result.getReturnType().resolve() == Mono.class;
boolean isAlreadyResponse = result.getReturnType().resolveGeneric(0) == Response.class;
return isMono && !isAlreadyResponse;
}

@Override
@SuppressWarnings("unchecked")
public Mono<Void> handleResult(ServerWebExchange exchange, HandlerResult result) {
Preconditions.checkNotNull(result.getReturnValue(), "response is null!");
// modify the result as you want
Mono<Response> body = ((Mono<Object>) result.getReturnValue()).map(Response::success)
.defaultIfEmpty(Response.success());
return writeBody(body, param, exchange);
}
}

然后,在 SpringBootApplication 中添加 Bean
@SpringBootApplication
public class SmartApplication {

@Autowired
ServerCodecConfigurer serverCodecConfigurer;
@Autowired
RequestedContentTypeResolver requestedContentTypeResolver;

@Bean
ResponseWrapper responseWrapper() {
return new ResponseWrapper(serverCodecConfigurer
.getWriters(), requestedContentTypeResolver);
}
//Spring start
public static void main(String[] args) {
SpringApplication.run(SmartApplication.class, args);
}
}

我的回复课,供引用
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Response<T> {
boolean success;
T data;
Object error;
String warning;

public Response() {
}


public static Response success() {
return success(null);
}

public static <T> Response success(T data) {
return new Response<T>().setSuccess(true).setData(data);
}

public static Response error(Throwable e) {
LogManager.getLogger(StackLocatorUtil.getCallerClass(2)).info(e);
return new Response().setSuccess(false).setError(e);
}

public static Response error(Object e) {
return new Response().setSuccess(false).setError(e);
}

public static Response error(String e) {
return new Response().setSuccess(false).setError(e);
}

/* get success */
public boolean isSuccess() {
return success;
}

/* set success */
public Response setSuccess(boolean success) {
this.success = success;
return this;
}

/* get data */
public Object getData() {
return data;
}

/* set data */
public Response setData(T data) {
this.data = data;
return this;
}

/* get error */
public Object getError() {
return error;
}

/* set error */
public Response setError(Object error) {
this.error = error;
return this;
}
}

关于spring - Webflux 还不支持 ResponseBodyAdvice?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48705172/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com