2013-08-13 48 views
25

Tôi nhận được một NullPointerException khi cố gắng @Autowire tôi @Service:Không thể Autowire Dịch vụ trong 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: Đây là 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

Bạn có thể đăng stacktrace không? –

Trả lời

71

Đó là bởi vì mùa xuân không được quản lý PagePopulationInterceptor của bạn ví dụ. Bạn đang tạo nó cho mình trong các mã dưới đây

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

sự thay đổi đó để

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

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

Bằng cách này, mùa xuân sẽ quản lý vòng đời của PagePopulationInterceptor dụ kể từ khi nó được tạo ra từ một phương pháp @Bean. Mùa xuân sẽ quét nó cho mục tiêu @Autowired và tiêm chúng.

Giả định rằng PagePopulationInterceptor nằm trong gói là @ComponentScan ed.

+1

@dtrunk Bạn được chào đón. Bất cứ khi nào một trường '@ Autowired' là null, hãy kiểm tra bối cảnh của bạn cho các hạt bị thiếu. –

+1

Btw .: Sử dụng '@ Component' kết hợp với quét thành phần tốt hơn nhiều so với việc tạo phương thức chú thích' @ Bean' ;-) – dtrunk

+0

@dtrunk những gì cần thay đổi trong ví dụ này để làm những gì bạn nói? –

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