Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [java.lang.ArrayIndexOutOfBoundsException: 1] with root cause
在springboot中的shiro自定义配置类注入RedisManager,在比较旧的版本是host和port分开写,新的版本需要把host和port拼接起来,通过redismanager源码中可以看到,init()是通过字符串分割 “:” ,来分别获取host和port,
public class RedisManager extends WorkAloneRedisManager implements IRedisManager {
private static final String DEFAULT_HOST = "127.0.0.1:6379";
private String host = "127.0.0.1:6379";
private int timeout = 2000;
private String password;
private int database = 0;
private JedisPool jedisPool;
public RedisManager() {
}
private void init() {
synchronized(this) {
if (this.jedisPool == null) {
String[] hostAndPort = this.host.split(":");
this.jedisPool = new JedisPool(this.getJedisPoolConfig(), hostAndPort[0], Integer.parseInt(hostAndPort[1]), this.timeout, this.password, this.database);
}
}
}
所以我们在application.yml配置类中,配置的post和port,需要自己拼接起来
spring:
redis:
host: 127.0.0.1
port: 6379
database: 1
password: 123456
jedis:
pool:
max-idle: 8
min-idle: 1
max-active: 8
timeout: 2000
@Value("${spring.redis.password}")
private String password;
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private String port;
private RedisManager redisManager() {
String host=this.host+":"+this.port; //重点
RedisManager redisManager = new RedisManager();
redisManager.setHost(host);
redisManager.setDatabase(1);
redisManager.setTimeout(2000);
redisManager.setPassword(password);
return redisManager;
}