• Spring@Autowired java.lang.NullPointerException 空指针


    在使用@Autowired注解注入出现的空指针  java.lang.NullPointerException  可能存在的错误原因:

    1.注解的扫描有问题

     在xml配置了这个标签后,spring可以自动去扫描base-pack下面或者子包下面的java文件,如果扫描到有@Component @Controller@Service等这些注解的类,则把这些类注册为bean

    注意:如果配置了<context:component-scan>那么<context:annotation-config/>标签就可以不用再xml中配置了,因为前者包含了后者。另外<context:component-scan>还提供了两个子标签

    1.        <context:include-filter>

    2.       <context:exclude-filter>

    在说明这两个子标签前,先说一下<context:component-scan>有一个use-default-filters属性,改属性默认为true,这就意味着会扫描指定包下的全部的标有@Component的类,并注册成bean.也就是@Component的子注解@Service,@Reposity等。所以如果仅仅是在配置文件中这么写

    <context:component-scan base-package="tv.huan.weisp.web"/>

     Use-default-filter此时为true那么会对base-package包或者子包下的所有的进行java类进行扫描,并把匹配的java类注册成bean。

    可以发现这种扫描的粒度有点太大,如果你只想扫描指定包下面的Controller,该怎么办?此时子标签<context:incluce-filter>就起到了勇武之地。如下所示

    <context:component-scan base-package="tv.huan.weisp.web .controller">  

    <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>   

    </context:component-scan>  

    这样就会只扫描base-package指定下的有@Controller下的java类,并注册成bean

    但是因为use-dafault-filter在上面并没有指定,默认就为true,所以当把上面的配置改成如下所示的时候,就会产生与你期望相悖的结果(注意base-package包值得变化

    <context:component-scan base-package="tv.huan.weisp.web">  

    <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>   

    </context:component-scan>  

    此时,spring不仅扫描了@Controller,还扫描了指定包所在的子包service包下注解@Service的java类

    此时指定的include-filter没有起到作用,只要把use-default-filter设置成false就可以了。这样就可以避免在base-packeage配置多个包名这种不是很优雅的方法来解决这个问题了。

    另外在我参与的项目中可以发现在base-package指定的包中有的子包是不含有注解了,所以不用扫描,此时可以指定<context:exclude-filter>来进行过滤,说明此包不需要被扫描。综合以上说明

    Use-dafault-filters=”false”的情况下:<context:exclude-filter>指定的不扫描,<context:include-filter>指定的扫描

    2.类的注解问题

    ServiceImpl必须以@Service或@Component注解才行。

    2。自动写入的时候把接口写成实现类了 
    @Autowired 
    private ServiceImpl      ServiceImpl; 
    应该是 
    @Autowired 
    private Service   Service ;

    3。在Dao 类上加上@Repository注解   mybatisDao  mapper注解

    Spring 反射调用类中的@Autowired注解服务空指针

    解决方案

    原因:反射的类无法被Spring进行管理。
    解决:在使用前初始化一下(使用@PostConstruct注解)

    public class CompanyExecute {
    
        public static CompanyExecute companyExecute;
    
        @Autowired
        private CompanyService companyServiceImpl;
    
        /**
         * 初始化当前类
         */
        @PostConstruct
        public void init() {
            companyExecute = this;
        }
    
        public boolean insertCompany(String companyVoString) {
            boolean insertFlag = companyExecute.companyServiceImpl.insertCompany(companyVoString);
            return insertFlag;
        }
    
    }

     3.SpringBoot的@Autowired无法注入问题

    SpringBoot项目的Bean装配默认规则是根据Application类所在的包位置从上往下扫描!“Application类”是指SpringBoot项目入口类。这个类的位置很关键:推荐放把启动类放在com.example下(如下图),不要放在java下。

     解决:在启动类上加注解 @ComponentScan("com.example")

    1 @SpringBootApplication
    2 @ComponentScan("com.example")
    3 public class YyshopApplication {
    4  
    5     public static void main(String[] args) {
    6         SpringApplication.run(YyshopApplication.class, args);
    7     }
    8     
    9 }

    4.controller中对外方法接口写成private了

    静态工具类:

    package org.digdata.swustoj.util;
    
    import lombok.Getter;
    import lombok.NonNull;
    import org.springframework.beans.BeansException;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;
    
    /**
     * Created by hongfei.whf on 2016/10/31.
     */
    public class ContextUtil implements ApplicationContextAware {
    
        @Getter
        private static volatile ApplicationContext context = null;
    
        /**
         * 加载Spring配置文件时,如果Spring配置文件中所定义的Bean类实现了ApplicationContextAware 接口,那么在加载Spring配置文件时,会自动调用ApplicationContextAware 接口中的
         * public void setApplicationContext(ApplicationContext context) throws BeansException
         * & 方法,获得ApplicationContext对象
         *
         * @param applicationContext
         * @throws BeansException
         */
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            context = applicationContext;
        }
    
        /**
         * 获取bean
         *
         * @param clazz
         * @param beanName
         * @param <T>
         * @return
         */
        public static <T> T getBean(@NonNull Class<T> clazz, @NonNull String beanName) {
            return (T) context.getBean(beanName);
        }
    }

    在xml中定义bean
    <!--手动bean定义-->
    <bean class="org.digdata.swustoj.util.ContextUtil"/>
    1
    2
    使用示例
    /**
    * 判题队列
    */
    private DefaultJudgeQueue defaultJudgeQueue = ContextUtil.getBean(DefaultJudgeQueue.class, "defaultJudgeQueue");

    5配置文件

    1.异常信息

    2.有可能引起的原因:
    1.在applicationContext-service.xml的配置文件里的包扫描不对

    2.在web.xml里没有加载spring容器

    3.分布式工程,使用dubbo通信,在服务层,或者消费层, 单词写错了

    4.还有一种可能,有可能是pom 里的jar包冲突

  • 相关阅读:
    mongodb单机搭建
    zeus部署
    hive单机部署
    datax部署
    hadoop/hbase/hive单机扩增slave
    读取Jar中的json文件
    Mybatis 一对多 简单映射配置
    java/kotlin 读取文件、写入文件
    ES6中Json、String、Map、Object之间的转换
    java 客户端发起http请求2
  • 原文地址:https://www.cnblogs.com/klyjb/p/11050148.html
Copyright © 2020-2023  润新知