文档章节

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

code-ortaerc
 code-ortaerc
发布于 2019/12/14 20:01
字数 507
阅读 15
收藏 0

在写一个敏感词过滤器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()的方式调用,结果能注入成功!

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

© 著作权归作者所有

code-ortaerc
粉丝 0
博文 35
码字总数 42657
作品 0
广州
程序员
私信 提问
Spring 多线程下注入 bean 问题详解

问题 Spring 中多线程注入 userThreadService 注不进去,显示 userThreadService 为 null 异常。 代码如下: 解决方案一 把要注入的 Service,通过构造传过去,代码如下: 解决方案二 通过A...

LYB_124321
2018/02/28
196
0
spring-boot、mybatis整合

一、MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配...

小不点丶
2017/08/22
0
0
Spring Boot 2 实战:集成 MapStruct 类型转换神器

痛点 一种框架的出现都要解决个痛点,我想下面这这种不方便的操作经常有人写吧。假如类是数据库映射类: 类: 是DTO类: 我们从数据库查询 然后需要转换为,通常我们会这么写一个方法进行转换:...

码农小胖哥
2019/10/12
109
0
SpringCloud(第 044 篇)链接Mysql数据库简单的集成Mybatis框架采用MapperXml访问数据库

SpringCloud(第 044 篇)链接Mysql数据库简单的集成Mybatis框架采用MapperXml访问数据库 - 一、大致介绍 二、实现步骤 2.1 添加 maven 引用包 2.2 添加应用配置文件(springms-provider-use...

HMILYYLIMH
2017/10/19
186
0
Mybatis自动代码生成器的实现

本文介绍如何用Java编写高度自定义的代码生成器 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果...

智能辣子鸡
2018/11/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Kettle自定义jar包供javascript使用

我们都知道 Kettle 是用 Java 语言开发,并且可以在 JavaScript 里面直接调用 java 类方法。所以有些时候,我们可以自定义一些方法,来供 JavaScript 使用。 本篇文章有参考自:https://www...

CREATE_17
昨天
102
0
处理CSV文件中的逗号

我正在寻找有关如何处理正在创建的csv文件的建议,然后由我们的客户上传,并且该值可能带有逗号(例如公司名称)。 我们正在研究的一些想法是:带引号的标识符(值“,”值“,”等)或使用|...

javail
昨天
79
0
如何克隆一个Date对象?

将Date变量分配给另一个变量会将引用复制到同一实例。 这意味着更改一个将更改另一个。 如何实际克隆或复制Date实例? #1楼 简化版: Date.prototype.clone = function () { return new ...

技术盛宴
昨天
73
0
计算一个数的数位之和

计算一个数的数位之和 例如:128 :1+2+8 = 11 public int numSum(int num) { int sum = 0; do { sum += num % 10; } while ((num = num / 10) > 0); return sum;......

SongAlone
昨天
124
0
为什么图片反复压缩后普遍会变绿,而不是其他颜色?

作者:Lion Yang 链接:https://www.zhihu.com/question/29355920/answer/119088684 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 业余版概要:安卓的...

shzwork
昨天
81
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部