日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring中的Interceptor拦截器中使用@Autowired注解,在运行时会出现空指针

發布時間:2024/3/13 javascript 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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注解,在运行时会出现空指针的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。