如何在HandlerInterceptorAdapter中使用@ResponseBody记录Spring 3控制器的JSON响应?

我有控制器将JSON返回给客户端.控制器方法使用mvc注释进行标记,例如:

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

Spring知道返回JSON,因为Jackson在类路径上并且客户端正在请求JSON响应.我想记录这些请求和所有其他控制器的响应.在过去,我使用拦截器来做到这一点.但是,我从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

上一篇:java – 在Dart中,有没有办法拦截对编程结构的访问和变异?


下一篇:java – Spring MVC Handler Interceptor不运行