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