我最近开始使用spring实现一个应用程序,特别是使用了@RestController
注释。我之前为普通控制器定义了一个自定义视图解析器,但我想知道如何为其余控制器做类似的操作。我只是想在它返回之前捕获JSON,所以我可以打印它。
我猜是因为它并没有真正路由到"视图"视图解析器可能是错误的方法。我该怎么用?我可以使用HandlerInterceptor
吗?我如何仅定位@RestController
注释类?
答案 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>