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

时间:2013-07-23 14:42:50

标签: spring spring-mvc

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

我的控制器以这种方式定义:

@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消息(这是测试消息)

我该怎么做?

1 个答案:

答案 0 :(得分:3)

拦截器不适合做你想做的事情,因为它无法获得处理程序的返回值。

您可以使用面向方面编程(AOP)在不更改任何现有代码的情况下实现您的目标。为了在春天工作,你需要包括spring-aop和AspectJ 的罐子。

创建方面和建议

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

每次控制器方法返回时都会执行 afterReturning 方法。

启用@AspectJ支持

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

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

了解更多信息see the spring docs