我正在为我的控制器创建一个日志管理器,记录其中的每个操作并返回值
我的控制器以这种方式定义:
@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消息(这是测试消息)我该怎么做?
答案 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 方法。
通过将其添加到XML配置中来启用AspectJ支持。
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
了解更多信息see the spring docs。