javaspringaopportletaspects

Spring AOP injecting PortletRequest


I'm trying to inject a portletrequest in my aspect class

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

Only gives me an

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: 
No matching bean of type [javax.portlet.PortletRequest] found for dependency: 
expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

exception

but I can autowire HttpServletRequest - am I missing something?


Solution

  • Okay solved it after some experimenting, maybe it could be useful for someone else

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

    Important for these config is that the requesting resources (portlets or servlets) must run in spring context else no requestattributes are available at this point.