spring - 如何在 HandlerInterceptorAdapter 中使用 @ResponseBody 记录 Spring 3 Controller 的 JSON 响应?

标签 spring spring-mvc interceptor

我有将 JSON 返回给客户端的 Controller 。 Controller 方法使用 mvc 注释进行标记,例如:

@RequestMapping("/delete.me")
public @ResponseBody Map<String, Object> delete(HttpServletRequest request, @RequestParam("ids[]") Integer[] ids) {

Spring 知道返回 JSON,因为 Jackson 在类路径上并且客户端正在请求 JSON 响应。我想记录这些请求和所有其他 Controller 的响应。在过去,我使用拦截器来执行此操作。但是,我从 ModelAndView 获得了响应正文。既然我正在使用@ResponseBody,如何在拦截器中获取响应正文?具体来说,如何在此方法中获取响应正文?
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {

最佳答案

您可以使用 CustomizableTraceInterceptor 记录所有内容
您可以在应用程序上下文 xml 配置中设置它并使用 AOP:(日志级别跟踪)

    <bean id="customizableTraceInterceptor"  
        class="org.springframework.aop.interceptor.CustomizableTraceInterceptor">  
        <property name="exitMessage" value="Leaving $[methodName](): $[returnValue]" />  
    </bean>  

或者您可以通过在 Java 中实现它并使用方法 setExitMessage() 来完全自定义它:
public class TraceInterceptor extends CustomizableTraceInterceptor {

    private Logger log = LoggerFactory.getLogger("blabla");

    @Override
    protected void writeToLog(Log logger, String message, Throwable ex) {
        //Write debug info when exception is thrown
        if (ex != null) {
            log.debug(message, ex);
        }
          ....
    }

    @Override
    protected boolean isInterceptorEnabled(MethodInvocation invocation, Log logger) {
        return true;
    }

    @Override
    public void setExitMessage(String exitMessage) {
            .... //Use PlaceHolders
    }
}

并使用诸如“$[returnValue]”之类的占位符。您可以在 spring api documentation 中找到完整列表。 .

编辑:另外,如果你想在另一个拦截器中获取 @ResponseBody 的值,我认为直到版本 > 3.1.1 才可能。检查此问题:https://jira.springsource.org/browse/SPR-9226

关于spring - 如何在 HandlerInterceptorAdapter 中使用 @ResponseBody 记录 Spring 3 Controller 的 JSON 响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14348452/

相关文章:

java - [CORS][Spring Security] PreFlight 请求未处理

java - 如何在 Spring Boot 中持续接收并解析来自 REST API 的 JSON

java - 找不到可接受的表示 - 406 Not Acceptable 错误

spring-mvc - 使用 thymeleaf 和 spring boot 上传和显示图像

java - 在不使用 Maven 的情况下,我在哪里可以下载 Spring Framework jar?

java - CDI 事务拦截器不工作

angular - 如何设置{观察: 'response' } option globally in Angular 4. 3+?

java - 如何使用 spring spEL 将 servlet 上下文路径注入(inject)到 bean 属性?

flutter - Flutter 中的 JWT/RefreshToken 与 ExpiredTokenRetryPolicy/Interceptor

java - 如何扩展 afterPropertiesSet() 方法