解决Java普通Utils类(非Controller、Service)注入mapper为null

2020-08-08T22:00:48
关注公众号【好便宜】( ID:haopianyi222 ),领红包啦~
阿里云,国内最大的云服务商,注册就送数千元优惠券:https://t.cn/AiQe5A0g
腾讯云,良心云,价格优惠: https://t.cn/AieHwwKl
搬瓦工,CN2 GIA 优质线路,搭梯子、海外建站推荐: https://t.cn/AieHwfX9

在写一个敏感词过滤器Util的时候,需要注入mapper来进行数据库查询所有的敏感词,然后就向ServiceImpl里的注入一样写:

@Autowired
private SysSensitiveWordsMapper sensitiveWordsMapper

这时候注入的mapper为null,所有会报空指针异常,就算调用@Component注解加入还是为null(Utils工具类不是静态方法,注解注入的service和mapper是非静态的,也不行,即使把service和mapper注入为static静态的也还是会报空指针

先贴一下我debug的异常:

我自己尝试了一种方法,而且能成功注入mapper,这里做一下简单的记录:

@Component
public class FilterUtils {
    
    @Autowired
    private SysSensitiveWordsMapper sensitiveWordsMapper;

    public static FilterUtils filterUtils;

    @PostConstruct
    public void init(){
        filterUtils = this;
        filterUtils.sensitiveWordsMapper = this.sensitiveWordsMapper;
    }

    public static ServerResponse findSensitiveWord(String body) {
        SensitiveFilter filter = new SensitiveFilter();
        Set<String> sensitiveWordSet = new HashSet();
        List<SysSensitiveWords> txtList = filterUtils.sensitiveWordsMapper.selectAll();  // 查库获取所有的敏感词
        for (int i = 0; i < txtList.size(); i++) {
            String word = txtList.get(i).getWord();
            //将敏感词插入hashSet中
            sensitiveWordSet.add(word);
        }
        filter.init(sensitiveWordSet);
        if (body != null) {
            //判断检测内容不为空,则执行
            boolean result = filter.contains(body);
            String results = result ? null : "";
            if (results == null) {
                List set = filter.getSensitiveWord(body);
                System.out.println("内容具有" + set.size() + "个敏感词:" + set);
                return ServerResponse.createByErrorMessage("用户输入内容包含敏感词:" + set.toString() + ",请重新输入");
            }
        }
        return ServerResponse.createBySuccess();
    }
}

解决的关键是:需要将Utils类添加@Component注解注入Spring容器,添加init()方法,并用注解@PostConstruct注解修饰方法,  被@PostConstruct修饰的方法会在服务器加载Servle的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。PreDestroy()方法在destroy()方法执行执行之后执行,将findSensitiveWord修改为静态static方法,并通过filterUtils.sensitiveWordsMapper.selectAll()的方式调用,结果能注入成功!

希望能帮助到你哈哈哈。。。。

扫一扫关注公众号添加购物返利助手,领红包
当前页面是本站的「Baidu MIP」版。发表评论请点击:完整版 »
因本文不是用Markdown格式的编辑器书写的,转换的页面可能不符合MIP标准。