如何在Spring MVC中由MessageConverter处理之前将响应转换为另一种类型

时间:2016-09-09 08:20:42

标签: spring spring-mvc

例如,这是一个返回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,有没有办法只转换一次转换数据?

2 个答案:

答案 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);
    }
}