2011-10-07 2 views
10

Aspect의 서비스 계층 인스턴스 @Autowire을 사용할 수 없습니다. Aspect에서 @Autowired bean에 대한 참조는 NULL이고 그것은 NullPointerException을 던집니다. 어떤 도움을 많이 주시면 감사하겠습니다. 제 생각에는, 나는 엉망이되었습니다. Aspect에서 Spring MVC의 Autowired 종속성이 삽입되지 않았습니다.

다음

servlet-context.xml입니다 : 여기
@Configurable 
@Component 
@Aspect 
public class AuthenticationAspect { 
private static final Logger logger = LoggerFactory.getLogger(AuthenticationAspect.class); 

@Autowired 
private LoginService loginService; 

    //.... 
} 

@Authentication 주석을 사용하여 내 컨트롤러는 위의 정의 :

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

내가 얻고 다음 다음

<!-- 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 /> 

나의 화면입니다 예외 :

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) 

답변

17

this piece of the documentation 참조 : 스프링의 IoC를 사용하여 AspectJ 설정

7.8.3

봄 응용 프로그램과 AspectJ의 측면을 사용하면 원하는 모두 자연 등을 구성 할 수 있기를 기대 Spring을 사용하는 측면. AspectJ 런타임 자체는 aspect 생성을 담당하고 Spring을 통해 AspectJ로 생성 된 aspect를 설정하는 방법은 aspect에 의해 사용되는 AspectJ 인스턴스화 모델 ('per-xxx'절)에 의존한다.

대부분의 AspectJ 측면은 싱글 톤 측면이다. 이러한 aspect의 설정은 매우 쉽다 : 단순히 aspect 유형을 참조하는 bean 정의를 생성하고 bean 속성 'factory-method = "aspectOf"를 포함시킨다. 이것은 Spring이 인스턴스 자체를 생성하기보다는 AspectJ에 요청하여 aspect 인스턴스를 얻도록한다. 예 :

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

의사는 부피가 크지 만 왕입니다. – lwpro2

+0

factory-method = "aspectOf"를 추가하면 내 문제가 해결되었습니다! – sjaiswal

+0

안녕하세요, 자바 구성으로 변환하는 방법을 알고 계십니까? – Sofiane

관련 문제