springboot 項目中在普通類中調用dao層的mapper 出現空指針異常


項目中我遇到同樣的問題 特記載一下

有兩種方式

 

一、

該類使用@Component注解

添加一個本類類型的靜態字段

創建一個初始化方法,貼上@PostConstruct 標簽,用於注入bean

創建方法調用mapper或service接口

最后直接在普通類中調用即可

@Component泛指組件,當組件不好歸類的時候,我們可以使用這個注解進行標注。

 被@PostConstruct修飾的方法會在服務器加載Servlet的時候運行,並且只會被服務器調用一次,類似於Serclet的inti()方法。被@PostConstruct修飾的方法會在構造函數之后,init()方法之前運行。

個人理解就是mapper 裝載失敗 重點init()方法中轉了一次

@Component
public class TestUtil {

    @Autowired
    private DoctorInformationMapper doctorInformationMapper;


    public static TestUtil testUtil;

    @PostConstruct
    public void init() {
        testUtil = this;
        testUtil.doctorInformationMapper = this.doctorInformationMapper;
    }

    //調用
    public static int getOpenId() {
        int count = testUtil.doctorInformationMapper.count("12313");
        return count;
    }
    
}

 

二。通過spring 容器去拿

2.1首先打印出Spring容器所有的Bean名稱

@Component
public class ApplicationContextBean implements ApplicationContextAware, InitializingBean {

    public static ApplicationContext applicationContext;

    /**
     * 獲取 ApplicationContext
     *
     * @param applicationContext
     * @throws BeansException
     */
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        ApplicationContextBean.applicationContext = applicationContext;
    }

    /**
     * 打印IOC容器中所有的Bean名稱
     *
     * @throws Exception
     */
    @Override
    public void afterPropertiesSet() throws Exception {
        String[] names = applicationContext.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(">>>>>>" + name);
        }
       System.out.println("------\nBean 總計:" + applicationContext.getBeanDefinitionCount());
    }

}

不用調用測試,項目啟動就會在后台打印出來

 

2.2開始寫獲取bean工具類

@Component
public class SpringUtil implements ApplicationContextAware {
    private static ApplicationContext applicationContext = null;

    public SpringUtil() {
    }

    public void setApplicationContext(ApplicationContext arg0) throws BeansException {
        if (applicationContext == null) {
            applicationContext = arg0;
        }

    }

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    public static void setAppCtx(ApplicationContext webAppCtx) {
        if (webAppCtx != null) {
            applicationContext = webAppCtx;
        }
    }

    /**
     * 拿到ApplicationContext對象實例后就可以手動獲取Bean的注入實例對象
     */
    public static <T> T getBean(Class<T> clazz) {
        return getApplicationContext().getBean(clazz);
    }

    public static <T> T getBean(String name, Class<T> clazz) throws ClassNotFoundException {
        return getApplicationContext().getBean(name, clazz);
    }

    public static final Object getBean(String beanName) {
        return getApplicationContext().getBean(beanName);
    }

    public static final Object getBean(String beanName, String className) throws ClassNotFoundException {
        Class clz = Class.forName(className);
        return getApplicationContext().getBean(beanName, clz.getClass());
    }

    public static boolean containsBean(String name) {
        return getApplicationContext().containsBean(name);
    }

    public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
        return getApplicationContext().isSingleton(name);
    }

    public static Class<?> getType(String name) throws NoSuchBeanDefinitionException {
        return getApplicationContext().getType(name);
    }

    public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {
        return getApplicationContext().getAliases(name);
    }
  
//測試 public static String getCharId(String chatId) { ChatListAssociationMapper associationMapper = (ChatListAssociationMapper) SpringUtil.getBean("chatListAssociationMapper");//這個參數是spring容器里存在的,名字最好復制,大小寫要一致,不然會失敗 return associationMapper.chatId(chatId); }
}

 

注意以上的兩種方法都不能在main方法調用,會報空指針異常


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM