gpt4 book ai didi

spring - 如何从 HandlerInterceptor 获取我的 Controller 的返回值

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

我正在为我的 Controller 创建一个日志管理器,用于记录其中的每个操作并返回值

我的 Controller 是这样定义的:

@Controller
@RequestMapping(value="/ajax/user")
public class UserController extends AbstractController{
@RequestMapping(value="/signup")
public @ResponseBody ActionResponse signup(@Valid SignupModel sign) {
ActionResponse response=new ActionRespone();
response.setMessage("This is a test message");
return response;
}
}

我定义了一个 HandlerInterceptor 来记录每个处理程序的输出:
@Component
public class ControllerInterceptor implements HandlerInterceptor {

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return true;
}
public void postHandle(
HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
throws Exception {

LogManager log=new LogManager();
log.setMessage();//I need returned ActionResponse here
}

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

}

}

我在哪里使用 log.setMessage();我需要从注册方法返回的我的 ActionResponse 消息(这是一条测试消息)

我怎样才能做到这一点?

最佳答案

拦截器不是执行您想要的操作的正确位置,因为它无法获取处理程序的返回值。
您可以使用面向方面的编程 (AOP) 实现您想要的,而无需更改任何现有代码。为了让它在 spring 中工作,你需要包含 spring-aop 和 AspectJ 的 jar 。
创建方面和建议

@Aspect
@Component
public class ActionResponseLoggerAspect {

private static final Logger logger = LoggerFactory.getLogger(ActionResponseLoggerAspect.class);

@AfterReturning(pointcut="execution(* your.package.UserController.*(..)))", returning="result")
public void afterReturning(JoinPoint joinPoint , Object result) {

if (result instanceof ActionResponse) {
ActionResponse m = (ActionResponse) result;

logger.info("ActionResponse returned with message [{}]", m.getMessage());
}
}
}
每次 Controller 方法返回时都会执行 afterReturning 方法。
启用@AspectJ 支持
通过将它添加到您的 XML 配置来启用 AspectJ 支持。
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
更多信息 see the spring docs .

关于spring - 如何从 HandlerInterceptor 获取我的 Controller 的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17813457/

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