繁体   English   中英

Spring RestController自定义视图解析器

[英]Spring RestController custom view resolver

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

我猜因为它并不是真正地路由到“视图”,所以视图解析器可能是错误的方法。 我应该使用什么? 可以使用HandlerInterceptor吗? 我将如何仅@RestController注释类?

您的控制器(最有可能)最终返回一个对象,该对象由适当的HttpMessageConverter (可能是这个)序列化为JSON。

当消息转换器将您返回的对象的JSON表示直接写入响应输出流时,您将需要子类MappingJackson2HttpMessageConverter并覆盖其writeInternal方法,从而有机会在序列化过程中应用您的自定义逻辑。 然后,您需要注册此自定义转换器,而不是默认转换器(或至少之前 )。

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

我认为拦截器无法为您做很多事情,因为它仅为您提供一个ModelAndView其中包含从控制器返回的对象,而不是其序列化版本。

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

您可以按照此处所述使用HandlerInterceptorAdapter

如您所见,可以像这样配置拦截映射

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM