4

我有将 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) {
4

1 回答 1

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 文档中找到完整列表。

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

于 2013-01-30T16:25:39.563 回答