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方法调用,会报空指针异常
springboot 项目中在普通类中调用dao层的mapper 出现空指针异常的更多相关文章
- SpringBoot 项目在静态工具类中注入 RedisTemplate
静态属性不能直接注入,可以通过其set方法进行注入.(注意生成的set方法需要去掉static). 在工具类里直接注入RedisTemplate,两种方法: (1)使用@Autowired priva ...
- 尚硅谷面试第一季-11MyBatis中当实体类中的属性名和表中的字段名不一样怎么办
问题: MyBatis中当实体类中的属性名和表中的字段名不一样 ,怎么办 ? 解决方案: 1.写sql语句时起别名 <!-- id属性:必须是接口中方法的方法名 resultType属性:必须是 ...
- 实现Square类,让其继承自Rectangle类,并在Square类增添新属性和方法,在2的基础上,在Square类中重写Rectangle类中的初始化和打印方法
实现Square类,让其继承自Rectangle类,并在Square类增添新属性和方法,在2的基础上,在Square类中重写Rectangle类中的初始化和打印方法 #import <Found ...
- 转载:C++中两个类中互相包含对方对象的指针问题
原文链接:http://www.cnblogs.com/hanxi/archive/2012/07/25/2608068.html 前几天很不爽,因为C++中两个类中互相包含对方对象的指针编译时提示某 ...
- 【记录】mybatis中获取常量类中数据
部分转载,已注明来源: 1.mybatis中获取常量类中数据 <update id="refuseDebt"> UPDATE dt_debt a SET ...
- cc31a_demo--CppPrimer_静态成员与继承-在派生类中访问基类中的static成员的方法
//*基类中的static成员,在整个继承层次中只有一个实例 //*在派生类中访问基类中的static成员的方法 //1.基类名::成员名 //2.子类名::成员名 //3.对象.成员名 //4.指针 ...
- controller层负责创建类传递类给service;service层负责逻辑编写调用dao层 将编写后的类传递到dao层,保证事务的正确性;dao层负责数据的持久化
controller层负责创建类传递类给service:service层负责逻辑编写调用dao层 将编写后的类传递到dao层,保证事务的正确性:dao层负责数据的持久化
- Java中的一个类怎么调用另一个类中的方法
如果另一个类中的那个方法是私有的话,就不能直接调用到,如果是其他类型的话看情况,如果是静态的(static)话,直接用类名可以调用到,如果是非静态的,就需要利用另一个类的实例(也就是用那个类生成的对象 ...
- Python中从B类中调用A类的方法。
好久没上了,Python还在学--最近进度有点慢... 下面代码记录了一个不太好理解的点,自己写了个小例子,总算是理顺了. B类想要调用A类,自己在网上看了一下其他人的回复:创建A类的实例,直接调用这 ...
随机推荐
- eclipse+maven搭建springboot项目入门
一.下载jdk,例如(jdk1.8.171) 安装(注意仅仅安装jdk就可以了,不要安装jre,设置JAVA_HOME,配置jdk环境变量) 二.下载maven(apache-maven-3.5.3- ...
- 使用xpath爬取猫眼电影排行榜
最近在学习xpath,在网上找资料的时候,发现一个新手经常拿来练手的项目,爬取猫眼电影前一百名排行的信息,很多都是跟崔庆才的很雷同,基本照抄.这里就用xpath自己写了一个程序,同样也是爬取猫眼电影, ...
- springboot的一些注解
springboot注解以及一些晦涩难理解的点介绍 @Validated 用于注入数值校验的注解(JSR303数据校验) @PropertySource 用于加载指定的配置文件,例如@Property ...
- python 装饰器,生成器,迭代器
装饰器 作用:当我们想要增强原来已有函数的功能,但不想(无法)修改原函数,可以使用装饰器解决 使用: 先写一个装饰器,就是一个函数,该函数接受一个函数作为参数,返回一个闭包,而且闭包中执行传递进来的函 ...
- java接口自动化测试小dome
GitHub地址:https://github.com/leonInShanghai/InterfaceAutomation 这个dome 请求 https://www.v2ex.com/api/no ...
- python爬去虎扑数据信息,完成可视化
首先分析虎扑页面数据 如图我们所有需要的数据都在其中所以我们获取需要的内容直接利用beaitifulsoupui4``` soup.find_all('a',class_ ...
- symfony3 使用命令行工具生成Entity实体所踩的坑
1.把配置文件汇总连接邮箱的配置信息注释掉了,在创建Entity时php bin/console doctrine:generate:entity报错 2. 错误原因是实体文件映射到数据库中的字段时候 ...
- LeetCode OJ -- 无重复字符的最长子串
给定一个字符串,找出不含有重复字符的 最长子串 的长度. 示例: 给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3. 给定 ...
- skywalking 6.1 简明指南
skywalking 分布式系统的应用程序性能监视工具,专为微服务.云本机架构和基于容器(Docker.K8s.Mesos)架构而设计 背景 随着微服务架构的流行,一些微服务架构下的问题也会越来越突出 ...
- zencart通过产品id 批量添加推荐产品
1.修改 admin/featured.php 查找 pre_add_confirmation 将 pre_add_confirmation 与 break; 之间的代码,用下面的代码替换即可 &l ...