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