Spring RestController自定义视图解析器

时间:2014-12-16 06:13:30

标签: java spring spring-mvc

我最近开始使用spring实现一个应用程序,特别是使用了@RestController注释。我之前为普通控制器定义了一个自定义视图解析器,但我想知道如何为其余控制器做类似的操作。我只是想在它返回之前捕获JSON,所以我可以打印它。

我猜是因为它并没有真正路由到"视图"视图解析器可能是错误的方法。我该怎么用?我可以使用HandlerInterceptor吗?我如何仅定位@RestController注释类?

2 个答案:

答案 0 :(得分:2)

您的控制器(最有可能)最终返回一个对象,该对象被相应的HttpMessageConverter序列化为JSON - 可能是this one

当消息转换器将返回对象的JSON表示直接写入响应输出流时,您需要继承MappingJackson2HttpMessageConverter并覆盖其writeInternal方法以获得应用自定义逻辑的机会围绕序列化。然后你需要注册这个自定义转换器而不是默认转换器(或至少之前)。

如果您的后处理可以由杰克逊可以处理的自定义序列化替换,那么最好的选择是适当地设置ObjectMapper并在构建时将其传递给jackson消息转换器。

我不认为拦截器可以为你做很多事情,因为它只为你提供ModelAndView 包含从控制器返回的对象,而不是其序列化版本。

作为替代方案,您当然可以使用请求过滤器(在整个Spring MVC生命周期之外),提供自定义HTTP响应包装器(带有一些ByteArrayOutputStream来累积JSON输出)然后进行后处理在将其写入实际响应输出流之前。

答案 1 :(得分:0)

您可以按照here

所述使用HandlerInterceptorAdapter

正如您所看到的,可以像这样配置拦截映射

<!-- Configuring interceptors based on URI -->
<interceptors>
    <interceptor>
        <mapping path="/home" />
        <beans:bean class="com.journaldev.spring.RequestProcessingTimeInterceptor"></beans:bean>
    </interceptor>
</interceptors>