如何从 HandlerInterceptor 获取控制器的返回值

2024-03-03

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

我的控制器是这样定义的:

@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-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());
        }
    }
}

The 回国后每次控制器方法返回时都会执行方法。

启用@AspectJ 支持

通过将其添加到 XML 配置来启用 AspectJ 支持。

<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

欲了解更多信息请参阅春季文档 http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#aop-advice-after-returning.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 HandlerInterceptor 获取控制器的返回值 的相关文章

随机推荐