當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
Spring中的Interceptor拦截器中使用@Autowired注解,在运行时会出现空指针
生活随笔
收集整理的這篇文章主要介紹了
Spring中的Interceptor拦截器中使用@Autowired注解,在运行时会出现空指针
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在開發登錄模塊時,我們會使用攔截器進行是否已登錄的校驗等,通常會通過如下自定義一個攔截器
package com.demo.interceptors;import com.demo.service.ITestService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;public class TestInterceptor implements HandlerInterceptor {@Autowiredprivate ITestService testService;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {this.testService.test();return false;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {} }并將該攔截器注冊到spring中
package com.demo.configure;import com.demo.interceptors.TestInterceptor; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration public class WebAppConfigure implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new TestInterceptor()).addPathPatterns("/**").excludePathPatterns("/login", "*.css", "*.js");} }在攔截器中我們通常會調用Service中的方法,執行一些業務邏輯的判斷
package com.demo.service;public interface ITestService {void test();} package com.demo.service.impl;import com.demo.service.ITestService; import org.springframework.stereotype.Service;@Service public class TestService implements ITestService {@Overridepublic void test() {System.out.println("test");} }當程序運行,并訪問時會出現空指針異常,如下圖所示
此時會發現TestInterceptor類中的testService為null,并沒有因為添加了@Autowird注解而注入進來。是因為在WebAppConfigure類中,是new出來的TestInterceptor對象,因此不會觸發spring的自動注入,導致空指針異常。
可以通過如下兩種方式解決
1)將TestInterceptor類添加@Component注解,然后在WebAppConfigure類中使用@Autowird,將TestInterceptor對象注入進來
package com.demo.configure;import com.demo.interceptors.TestInterceptor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration public class WebAppConfigure implements WebMvcConfigurer {@Autowiredprivate TestInterceptor testInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(testInterceptor).addPathPatterns("/**").excludePathPatterns("/login", "*.css", "*.js");} } package com.demo.interceptors;import com.demo.service.ITestService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;@Component public class TestInterceptor implements HandlerInterceptor {@Autowiredprivate ITestService testService;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {this.testService.test();return false;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {} }2)無需在TestInterceptor類上添加@Component直接,直接在WebAppConfigure類中添加經由@Bean注解的返回TestInterceptor對象的方法。
package com.demo.configure;import com.demo.interceptors.TestInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration public class WebAppConfigure implements WebMvcConfigurer {@Beanpublic TestInterceptor testInterceptor() {return new TestInterceptor();}@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(testInterceptor()).addPathPatterns("/**").excludePathPatterns("/login", "*.css", "*.js");} }兩種方式都能夠使得TestInterceptor類中的testService不再為null,并且成功調用testService對象的test()方法
總結
以上是生活随笔為你收集整理的Spring中的Interceptor拦截器中使用@Autowired注解,在运行时会出现空指针的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: XR文字输入技术
- 下一篇: vue2 provide和inject的