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

时间:2013-01-15 22:54:14

标签: spring spring-mvc interceptor

我有控制器将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) {

1 个答案:

答案 0 :(得分:5)

您可以使用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的值,我认为直到版本&gt;才能实现。 3.1.1。请检查此问题:https://jira.springsource.org/browse/SPR-9226