我正在为我的控制器创建一个日志管理器,用于记录其中的每个操作并返回值
我的控制器是这样定义的:
@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(使用前将#替换为@)