gpt4 book ai didi

spring - 如何在 HandlerInterceptorAdapter 中使用 @ResponseBody 记录 Spring 3 Controller 的 JSON 响应?

转载 作者:行者123 更新时间:2023-12-05 01:12:20 26 4
gpt4 key购买 nike

我有将 JSON 返回给客户端的 Controller 。 Controller 方法使用 mvc 注释进行标记,例如:

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

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

关于spring - 如何在 HandlerInterceptorAdapter 中使用 @ResponseBody 记录 Spring 3 Controller 的 JSON 响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14348452/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com