2010-07-26 85 views
2

我想在我的切面类的Spring AOP注入的PortletRequest

@Autowired(required = true) 
private PortletRequest request; 

@Before("execution(* de.ac.mis.dao.*.getSessionFactory())") 
public void setUsername() { 
    System.out.println("Now I'm setting the username " + this.request); 
} 

中注入的PortletRequest只给了我一个

​​

例外

但我可以自动装配HttpServletRequest - 我是遗漏了什么?

回答

0

好的解决了这个问题一些试验后,也许它可能是为别人有用

@Before("execution(* de.ac.mis.dao.acDynamicUserSessionFactory.getSessionFactory())") 
public void setUsername(JoinPoint joinPoint) { 
    acDynamicUserSessionFactory dao = (acDynamicUserSessionFactory) joinPoint.getTarget(); 
    RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes(); 
    String userName = ""; 
    if (requestAttributes instanceof PortletRequestAttributes) { 
     PortletRequest request = ((PortletRequestAttributes) requestAttributes).getRequest(); 
     userName = request.getRemoteUser(); 
    } else if (requestAttributes instanceof ServletRequestAttributes) { 
     HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest(); 
     userName = request.getRemoteUser(); 
    } 
    dao.setUserName(userName); 
    this.log.debug("acUserSessionfactory was set for user: " + userName); 
} 

重要的是这些配置是,请求资源(Portlet或小服务程序)必须在春天上下文中运行其他没有requestattributes可用在此刻。

0

我选择使用resolveReference看的JavaDoc,其要求后:

在最低限度:对于键 “请求” HttpServletRequest的/的PortletRequest参考,并且在HttpSession/PortletSession中用于密钥参考 “会话”。

例如代码:

RequestAttributes attrs = RequestContextHolder.getRequestAttributes(); 
// According to JavaDoc, PortletRequest should be available 
PortletRequest request = (PortletRequest) attrs.resolveReference("request");