一,异常信息:
Superclass has no null constructors but no arguments were given
二,版本信息:
springframework:3.2.2
jedis:2.3
三,spring配置信息:
<!-- jedisPool配置信息 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="1000"/> <!-- 控制一个pool可分配多少个jedis实例 -->
<property name="maxIdle" value="200" /> <!-- 控制一个pool最多有多少个状态为idle(空闲)的jedis实例 -->
<property name="maxWaitMillis" value="2000" /> <!-- 表示当borrow一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException -->
<property name="testOnBorrow" value="true" /> <!-- 在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的 -->
</bean>
<bean id="jedisPool" class="redis.clients.jedis.JedisPool" destroy-method="destroy">
<constructor-arg ref="jedisPoolConfig" />
<constructor-arg value="127.0.0.1" />
<constructor-arg type="int" value="6379" />
</bean>
1,异常原因分析:
按照上面分析:对于没有实现接口的类,spring使用CGLIB来实现代理。目标类必须要有默认的无参构造函数。JedisPool类,确实没有无参的构造函数。为了解决这个问题,我包装了JedisPool类,新建JedisPoolWriper类:
public class JedisPoolWriper{
private static Logger logger= Logger.getLogger(JedisPoolWriper.class);
private JedisPool jedisPool = null;
public JedisPoolWriper(final JedisPoolConfig poolConfig,final String host,final int port){
try{
jedisPool = new JedisPool(poolConfig,host,port);
}catch(Exception e){
logger.error("Jedis Pool init failed:", e);
}
}
}
这个新生成的包装类,同样没有默认的无参构造函数,spring成功构造注入。对于这个问题,没有进一步跟踪。不知道是不是JedisPool继承了抽象类Pool影响的,如若被哪位兄弟解决了,做个好事儿,告知我呗。
包装类注入:
<bean id="jedisWritePool" class="com.hidata.framework.cache.redis.JedisPoolWriper" destroy-method="destroy" depends-on="jedisPoolConfig">
<constructor-arg name="poolConfig" ref="jedisPoolConfig" /> <!-- 加载jedisPool配置信息 -->
<constructor-arg name="host" value="114.111.162.219" /><!-- redis主机地址 -->
<constructor-arg name="port" value="6379"/> <!-- redis连接端口 -->
</bean>