例如,这是一个返回User
:
@RequestMapping(method = GET, value = "/user")
public User getUser() {
return new Users();
}
由于某些原因,客户期望其他类型
class CommonResponse<T> {
int code;
T data;
}
因此,在T
处理之前,我需要将User
(例如CommonResponse<T>
)的所有返回值转换为MessageConverter
。
因为应该修改多个请求hanlders,有没有办法只转换一次转换数据?
答案 0 :(得分:0)
您需要添加/配置自定义转换器。这样你的自定义转换器就会先于其他人执行
@EnableWebMvc
@Configuration
@ComponentScan({ "org.app.web" })
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void configureMessageConverters(
List<HttpMessageConverter<?>> converters) {
messageConverters.add(createCustomConverter());
super.configureMessageConverters(converters);
}
private HttpMessageConverter<Object> createCustomConverter() {
....
}
}
答案 1 :(得分:0)
最后我发现ResponseBodyAdvice可以做这样的工作。
示例代码:
@RestControllerAdvice
public class CommonAdvice implements ResponseBodyAdvice<Object> {
@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
return returnType.getDeclaringClass().getPackage().getName().startsWith("foo.bar.demo");
// you can change here to your logic
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
return new CommonResponse<Object>().setCode(200).setData(body);
}
}