发生缘由
- 学习如何抽取Jedis连接池工具类
环境
- redis版本:
redis-2.8.9
- 导入的两个Jar包分别为:
commons-pool2-2.3.jar
jedis-2.7.0.jar
- jdk版本:jdk-16.0.2
- Idea版本:2021.2
- 电脑系统:win10
问题描述
新建项目
创建一个JavaWeb项目:
- 新建一个Moudle。
- 右键Moudle名称,点击第二个选框Add frameworks Support…。
- 点击Java EE下面的web Application。
- 点击OK,这样就创建好了一个web文件夹,里面自带了一个index.jsp。
导入jar包及配置文件
- 在web文件夹下面创建一个WEB-INF目录,然后在WEB-INF目录下面创建一个lib文件夹。lib文件夹下面用于存放依赖的jar包。
- 将
commons-pool2-2.3.jar
和jedis-2.7.0.jar
两个jar包复制到lib文件夹下面。按住ctrl键选中两个jar包–>右键–>点击add as library。将外部jar包添加到IntelliJ IDEA项目。 - 复制配置文件
jedis.properties
到src目录下面。 - 创建utils包,在utils包下面创建一个类:
JedisPoolUtils
。里面写抽取的Jedis连接池的代码。 - main方法运行,结果发现报错。
报错信息
java.lang.ExceptionInInitializerError
at cn.com.demo01.redis.Demo01Redis.test(Demo01Redis.java:170)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:567)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)
Caused by: java.lang.NullPointerException: inStream parameter is null
at java.base/java.util.Objects.requireNonNull(Objects.java:233)
at java.base/java.util.Properties.load(Properties.java:407)
at cn.com.utils.JedisPoolUtils.<clinit>(JedisPoolUtils.java:37)
... 26 more
源码
jedis.properties
配置文件内容如下:
host=127.0.0.1
port=6379
maxTotal=50
maxIdle=10
JedisPoolUtils
类代码如下:
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class JedisPoolUtils {
private static JedisPool jedisPool;
static {
// 读取配置文件
InputStream is = JedisPoolUtils.class.getClassLoader().getResourceAsStream("jedis.properties");
//创建Properties对象
Properties pro = new Properties();
//关联文件
try {
pro.load(is);
} catch (IOException e) {
e.printStackTrace();
}
//获取数据,设置到JedisPoolConfig中
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(Integer.parseInt(pro.getProperty("maxTotal")));
config.setMaxIdle(Integer.parseInt(pro.getProperty("maxIdle")));
//初始化JedisPool
jedisPool = new JedisPool(config,pro.getProperty("host"),Integer.parseInt(pro.getProperty("port")));
}
/**
* 获取连接方法
*/
public static Jedis getJedis(){
return jedisPool.getResource();
}
}
- main方法代码如下:
import cn.com.utils.JedisPoolUtils;
import org.junit.Test;
import redis.clients.jedis.Jedis;
public class Demo01Redis {
@Test
public void test(){
//通过连接池工具类获取
Jedis jedis = JedisPoolUtils.getJedis();
//使用
jedis.set("hello","world");
//关闭 归还到连接池中
jedis.close();
}
}
解决方案
- 怀疑是写的代码错误了,一步一步排查,甚至于复制、粘贴,可是一直是没有任何效果,仍然是报错。
- 使用搜索引擎搜索
inStream parameter is null
发现有可能是配置文件没有放对位置,应该在src目录下面。可是打开项目,发现配置文件就是在src目录下面,没有任何的问题。 inStream parameter is null
:找不到配置文件错误。怀疑虽然将配置文件导入项目了,可是没有将配置文件导入到电脑本地。打开该项目在本地部署的路径,查看src文件夹下面是否有配置文件。很可惜,怀疑错误,里面有着配置文件。- 这时,突然想到,我以前是遇见过这种情况的。之前是将IDEA重启了一下,重新加载了一下配置文件,然后再运行,就不会报错了。
- 重启,运行单元测试。OK,成功了!
碎碎念
- 有句话说的好:重启解决90%的问题,重装解决99%的问题,换电脑解决100%的问题