5

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

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

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

我怎样才能做到这一点?

4

1 回答 1

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>

有关更多信息,请参阅 spring 文档

于 2013-07-23T14:54:50.193 回答