解决 Java 普通 Utils 类注入 mapper 为 null

本文讲述了在Java非Controller、Service的Utils工具类中注入mapper遇到的空指针问题,作者通过使用@Component注解将Utils类加入Spring容器,并利用@PostConstruct初始化方法成功解决了问题。
摘要由CSDN通过智能技术生成

解决 Java 普通 Utils 类(非 Controller、Service)注入 mapper 为 null
在写一个敏感词过滤器 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 () 的方式调用,结果能注入成功!

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值