2011-10-07 15 views
10

Non riesco a @Autowire l'istanza del livello di servizio in Aspetto. In Aspect, il riferimento al bean @Autowired è NULL e genera NullPointerException. Qualsiasi aiuto sarà molto apprezzato. Penso, ho incasinato la configurazione.Dipendenza autorizzata non iniettata in Aspect in Spring MVC

seguito è il mio servlet-context.xml:

<!-- Activates various annotations to be detected in bean classes --> 
<context:annotation-config /> 
<context:spring-configured />  

<!-- Scans the classpath of this application for @Components to deploy as beans --> 
<context:component-scan base-package="xx.yy" /> 

<!-- an @AspectJ aspect will be interpreted as an aspect by Spring AOP and beans in the context will be advised accordingly --> 
<aop:aspectj-autoproxy /> 

<beans:bean id="loggingAspect" class="xx.yy.aop.aspects.LoggingAspect" /> 
<beans:bean id="authenticationAspect" class="xx.yy.aop.aspects.AuthenticationAspect" /> 

<!-- Enables the Spring MVC @Controller programming model --> 
<annotation-driven /> 

seguito è il mio aspetto:

@Configurable 
@Component 
@Aspect 
public class AuthenticationAspect { 
private static final Logger logger = LoggerFactory.getLogger(AuthenticationAspect.class); 

@Autowired 
private LoginService loginService; 

    //.... 
} 

Ecco il mio controller utilizzando il @Authentication Annotazione definite in precedenza:

@Controller 
@RequestMapping("/user") 
public class UsersController { 

@Autowired 
private UserService userService; 

@Authenticate 
@RequestMapping(value="/{userId}/profile", method=RequestMethod.GET)  
public String displayUser(WebRequest webRequest, @PathVariable("userId") String userId, Model model) { 
    User user = userService.findUser(Long.valueOf(userId)); 
    model.addAttribute("user", user); 
    model.addAttribute("AccordionMenuTab","5"); 
    model.addAttribute("selectedLink","profile"); 
    return "profile"; 
} 

sto ottenendo seguente eccezione:

Oct 8, 2011 3:12:48 AM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet appServlet threw exception 
java.lang.NullPointerException 
    at xx.yy.controller.UsersController.displayUser_aroundBody1$advice(UsersController.java:28) 
    at xx.yy.controller.UsersController.displayUser(UsersController.java:1) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176) 
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426) 
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
    at java.lang.Thread.run(Thread.java:662) 

risposta

17

Vedi this piece of the documentation:

7.8.3 Configurazione aspetti AspectJ utilizzando Spring IOC

Quando si utilizza aspetti AspectJ con le applicazioni di primavera, è naturale per entrambi vogliono e si aspettano di essere in grado di configurare tale aspetti che utilizzano Spring. Il runtime AspectJ è di per sé responsabile della creazione di aspetti, e il modo di configurare gli aspetti creati da AspectJ tramite Spring dipende dal modello di istanziazione AspectJ (la clausola 'per-xxx') utilizzata dall'aspetto.

La maggior parte degli aspetti di AspectJ sono aspetti singleton. La configurazione di questi aspetti è molto semplice: basta creare una definizione di bean che faccia riferimento al tipo di aspetto normalmente, e includere l'attributo bean 'factory-method = "aspectOf"'. Ciò garantisce che Spring ottenga l'istanza dell'aspetto chiedendo ad AspectJ piuttosto che provare a creare un'istanza stessa. Per esempio:

<bean id="profiler" class="com.xyz.profiler.Profiler" 
     factory-method="aspectOf" /> 
+0

il doc è ingombrante, ma è il re. – lwpro2

+0

aggiungendo factory-method = "aspectOf" ha risolto il mio problema, grazie !! – sjaiswal

+0

Ciao, sai come tradurre in configurazione java? – Sofiane