2013-08-13 2 views
25

Я получаю NullPointerException при попытке @Autowire моего @Service:Может не Autowire службы в HandlerInterceptorAdapter

public class PagePopulationInterceptor extends HandlerInterceptorAdapter { 
    private @Autowired MyService service; 

    public @Override void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView mav) { 
     service.savePageView(IPUtils.toLong(request.getRemoteAddr()), request.getRequestURI(), request.getHeader("User-Agent")); 
     mav.addObject("counter", service.getCounter()); 
    } 
} 

@Configuration 
@ComponentScan(basePackages = "com.mycompany", excludeFilters = { @ComponentScan.Filter(Configuration.class) }) 
@PropertySource("classpath:application.properties") 
@EnableTransactionManagement 
@EnableWebMvc 
public class MyConfig extends WebMvcConfigurerAdapter { 
    public @Override void addInterceptors(InterceptorRegistry registry) { 
     registry.addInterceptor(new PagePopulationInterceptor()); 
    } 
} 

@Service 
@Transactional 
public class MyService { 
    private @Autowired PageViewDao pageViewDao; 

    public class Counter { 
     private long total; 
     private long today; 
     private long yesterday; 
     private long now; 

     // Getters and setters 
    } 

    public void savePageView(long ip, String visitPage, String userAgent) { 
     PageView obj = new PageView(); 
     obj.setVisitDate(new Date()); 
     obj.setUserAgent(userAgent); 
     obj.setPage(visitPage); 
     obj.setIp(ip); 

     pageViewDao.saveOrUpdate(obj); 
    } 

    public Counter getCounter() { 
     Counter ret = new Counter(); 
     // populate Counter members 
     return ret; 
    } 
} 

EDIT: Вот StackTrace:

java.lang.NullPointerException 
    com.mycompany.util.PagePopulationInterceptor.postHandle(PagePopulationInterceptor.java:22) 
    org.springframework.web.servlet.HandlerExecutionChain.applyPostHandle(HandlerExecutionChain.java:149) 
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:934) 
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936) 
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) 
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
+0

Можете ли вы опубликовать stacktrace? –

ответ

71

Это потому, что весна не управляет вашими PagePopulationInterceptor пример. Вы создаете сами в коде ниже

public @Override void addInterceptors(InterceptorRegistry registry) { 
    registry.addInterceptor(new PagePopulationInterceptor()); 
} 

изменения, чтобы

@Bean 
public PagePopulationInterceptor pagePopulationInterceptor() { 
    return new PagePopulationInterceptor(); 
} 

public @Override void addInterceptors(InterceptorRegistry registry) { 
    registry.addInterceptor(pagePopulationInterceptor()); 
} 

Таким образом, весна будет управлять жизненным циклом экземпляра PagePopulationInterceptor, так как он генерируется из метода @Bean. Весна сканирует его на @Autowired цели и вводит их.

Предполагается, что PagePopulationInterceptor находится в упаковке @ComponentScan ред.

+1

@ dtrunk Добро пожаловать. Всякий раз, когда поле '@ Autowired' равно null, проверьте свой контекст на отсутствие бобов. –

+1

Btw: Использование '@ Component' в сочетании с компонентным сканированием намного лучше, чем создание аннотированного метода' @ Bean' ;-) – dtrunk

+0

@dtrunk, что нужно изменить в этом примере, чтобы сделать то, что вы сказали? –

Смежные вопросы