考虑下面的控制器方法,
@GetMapping("/getdata")
public Data getDetails() {
try {
Data obj = template.getForObject("http://localhost:8090/details/get", Data.class);
return obj;
} catch (Exception e) {
.....
}
}
假设上述端点的响应对象如下:
data : {
name : "ABCD",
age : "20"
}
现在我试图实现的是将整个响应对象包装在另一个对象下,因此最终响应应该是这样的,
{
status : "SOMETHING",
response : {
name : "ABCD",
age : "20"
},
extra : null
}
所以问题是,我不想在每个控制器方法下创建一个函数来发送值给这个包装器对象。我的问题是,在Spring框架中是否有任何可能性允许我在某个地方创建一个全局包装器函数,并且它将自动选择它并包装来自控制器的响应?
您需要将ResponseBodyAdvice
实现为@ControllerAdvice
。首先,您需要为您的通用响应建立一个模型。
public class GenericResponse<T> {
private String status;
private String extra;
private T response;
}
然后你需要实现ResponseBodyAdvice
本身:
@ControllerAdvice
public class CustomResponseBodyAdvice implements ResponseBodyAdvice<Object> {
@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
return true;
}
@Override
public Object beforeBodyWrite(Object response, MethodParameter returnType, MediaType selectedContentType,
Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,
ServerHttpResponse response) {
GenericResponse<Object> genericResponse = new GenericResponse<>();
output.setStatus("SOMETHING"); // I guess that you need some logic here
output.setResponse(response);
return genericResponse;
}
}