2011-10-07 29 views
10

Tôi không thể @Autowire Sơ đồ lớp dịch vụ trong Aspect. Trong Aspect, tham chiếu đến bean @Autowired là NULL và nó ném NullPointerException. Bất kỳ trợ giúp sẽ được nhiều đánh giá cao. Tôi nghĩ, tôi đã nhầm lẫn với cấu hình.Phụ thuộc tự động không được tiêm vào Aspect trong Spring MVC

Sau đây là tôi 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 /> 

Sau đây là Aspect của tôi:

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

@Autowired 
private LoginService loginService; 

    //.... 
} 

Dưới đây là bộ điều khiển của tôi bằng cách sử dụng @Authentication Chú định nghĩa ở trên:

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

Tôi nhận được sau ngoại lệ:

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) 

Trả lời

17

Xem this piece of the documentation:

7.8.3 Cấu hình các khía cạnh AspectJ sử dụng Spring IoC

Khi sử dụng các khía cạnh AspectJ với các ứng dụng Spring, đó là tự nhiên cho cả hai muốn và mong đợi để có thể cấu hình như vậy khía cạnh sử dụng Spring. Bản thân thời gian chạy AspectJ chịu trách nhiệm tạo ra khía cạnh và các phương tiện cấu hình các khía cạnh được tạo ra AspectJ thông qua Spring phụ thuộc vào mô hình instantect AspectJ (mệnh đề 'per-xxx') được sử dụng bởi khía cạnh này.

Phần lớn các khía cạnh của AspectJ là các khía cạnh đơn lẻ. Cấu hình của các khía cạnh này rất dễ dàng: chỉ cần tạo một định nghĩa bean tham chiếu đến kiểu khía cạnh như bình thường, và bao gồm thuộc tính bean 'factory-method = "aspectOf"'. Điều này đảm bảo rằng Spring nhận được cá thể khía cạnh bằng cách yêu cầu AspectJ cho nó thay vì cố gắng tạo ra một cá thể riêng của nó. Ví dụ:

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

tài liệu cồng kềnh nhưng là nhà vua. – lwpro2

+0

thêm factory-method = "aspectOf" đã giải quyết được sự cố của tôi, cảm ơn !! – sjaiswal

+0

Xin chào, bạn có biết cách dịch sang cấu hình java không? – Sofiane

Các vấn đề liên quan