問題簡述:
我們在使用Spring系的產品的時候總是想當然的以為所有指定的Bean都會讓Spring來管理,其實不然,即使是Spring出品的產品也不全是的哦,以下是我遇到的一個使用@Component注解修飾的實體,在正常使用的時候報的空指針異常;我使用的是基於SpringWebsocket組件,
目的就是當多線程任務在第一階段完成以后向用戶推送數據.貼上代碼:
調用類:
實現類:
正常情況是直接就可以使用的,但是呢,遇到了初學時遇到的最多的空指針異常.然后按照正常思路一路搗鼓,什么配置@ComponentScan注解啊 SpringBoot啟動類位置啊,靜態注入啊等一系列手段,結果然並卵.然后網上一陣搜索,結果都沒有正確的解決方案,最后搭梯子去Google,然后在一個大神的博客里發現了端倪.然后了解到在使用SpringWebsocket的時候,Websocket的對象托管是放在ServerEndpointConfig.Configurator類里面的,然后就有了解決方案.直接上代碼:
public class EndpointConfigure extends ServerEndpointConfig.Configurator implements ApplicationContextAware {
private static volatile BeanFactory context;
@Override
public <T> T getEndpointInstance(Class<T> clazz) throws InstantiationException {
return context.getBean(clazz);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
EndpointConfigure.context = applicationContext;
}
}
大致原理就是 在使用Websocket組件托管對象中調用Spring托管對象的時候,因為是不同的容器,那就依據這個配置文件,將Spring托管的對象放到ServerEndpointConfig中,然后實例化EndpointConfigure對象到配置中,然后就可以調用了.是不是覺得很簡單.但是就是相信了SpringWebSocket組件這個"Spring"字樣的邪,
最后在SpringWebsocket的官方說明文檔上也找到了相關的說明,哎,不說了,我心里有很多羊駝在發怒.
注意:
以上解決方案只針對使用SpringWebsocket組件時遇到的空指針注入現象.
其他的Spring系項目注入空指針,請按照以下步驟檢查:
1. 配置@Componentscan注解.(其實在絕大多數的時候是不需要的,因為默認是全包掃描.包含Service controller Component)
2. 檢查SpringBoot啟動類的位置(這個檢查一般是針對要掃描其它依賴Jar包的配置,要將啟動類的位置放到具有相同包名的下面,
例如: com.baidu.server, com.baidu.website 如果啟動類在website目錄下面,但是你想將com.baidu.server下面的指定位置的Bean放到當前項目中,那就將啟動類移動到com.baidu下面,然后在Componentscan注解中配置一下就好了)
3. 當遇到的問題百度前5項(排除廣告)沒有你想要的答案,果斷用梯子去Google一下,絕對超乎想象的好使.
當前環境:
SpringBoot 2.1.X
spring-boot-starter-websocket
HiveJDBC