spring 注入 redis.clients.jedis.JedisPool 异常

本文解决了一个关于 Spring 在注入 Redis 客户端 JedisPool 实例时遇到的异常问题。异常信息提示 JedisPool 类没有无参构造函数。通过自定义 JedisPoolWrapper 类并提供带参数构造函数来解决此问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    一,异常信息:                 

             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>






<think>我们正在讨论Redis在Java中的应用,特别是使用Jedis客户端。用户询问`redis.clients.jedis.Jedis`属于哪个包。回答:`redis.clients.jedis.Jedis`类是Jedis客户端库的一部分,该库是Redis官方推荐的Java客户端之一。具体来说,它是Maven仓库中的`redis.clients:jedis`包(groupId:redis.clients,artifactId:jedis)中的核心类。如果需要使用Jedis,可以通过Maven或Gradle添加依赖。Maven依赖配置示例:```xml<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>5.1.2</version><!--请使用最新版本--></dependency>```Gradle依赖配置示例:```groovyimplementation'redis.clients:jedis:5.1.2'```在代码中,可以通过导入`redis.clients.jedis.Jedis`来使用这个类。例如:```javaimportredis.clients.jedis.Jedis;publicclassJedisExample{publicstaticvoidmain(String[]args){//连接到本地Redis服务try(Jedisjedis=newJedis("localhost",6379)){//设置一个键值对jedis.set("foo","bar");//获取值Stringvalue=jedis.get("foo");System.out.println(value);//输出:bar}}}```关于Jedis类:-它是线程不安全的,每个线程应该使用独立的Jedis实例或使用连接池(推荐使用JedisPool)。-实现了Closeable接口,可以使用try-with-resources语句确保连接关闭。-提供了几乎所有Redis命令的Java方法。注意:由于Jedis是阻塞式I/O,在高并发环境下,使用连接池管理Jedis实例是必要的。相关学习资源:官方GitHub仓库:https://github.com/redis/jedis总结:`redis.clients.jedis.Jedis`类属于`redis.clients:jedis`包,是一个用于与Redis服务器交互的Java客户端。接下来,我们按照要求提出相关问题。</think> `redis.clients.jedis.Jedis` 类是 **Jedis 客户端库** 的核心类,属于 **Maven 依赖包 `redis.clients:jedis`**。 ### Jedis 库信息 | 属性 | 值 | |------|----| | **Maven Group ID** | `redis.clients` | | **Maven Artifact ID** | `jedis` | | **最新稳定版本** | 5.1.2 (截至2024年3月) | | **官方 GitHub** | [https://github.com/redis/jedis](https://github.com/redis/jedis) | | **主要功能** | Java 实现的 Redis 客户端,支持所有 Redis 命令 | ### 添加 Jedis 依赖的方法 在 Maven 项目中添加依赖: ```xml <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>5.1.2</version> <!-- 使用最新稳定版本 --> </dependency> ``` 在 Gradle 项目中添加依赖: ```groovy implementation 'redis.clients:jedis:5.1.2' ``` ### Jedis 核心功能示例 ```java import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; public class JedisExample { public static void main(String[] args) { // 1. 直接创建Jedis实例(适合简单使用) try (Jedis jedis = new Jedis("localhost", 6379)) { jedis.set("test-key", "Hello Redis"); System.out.println(jedis.get("test-key")); // 输出: Hello Redis } // 2. 使用连接池(生产环境推荐) JedisPoolConfig poolConfig = new JedisPoolConfig(); poolConfig.setMaxTotal(10); // 最大连接数 try (JedisPool jedisPool = new JedisPool(poolConfig, "localhost", 6379)) { try (Jedis jedis = jedisPool.getResource()) { jedis.incr("counter"); System.out.println("Counter: " + jedis.get("counter")); } } } } ``` ### Jedis 主要特性 1. **完整协议支持**: - 支持所有 Redis 命令(字符串、哈希、列表、集合、有序集合等) - 支持 Redis 6.0+ 的 ACL 认证 - 支持 Redis 7.0+ 的 RESP3 协议 2. **连接管理**: - 内置连接池(JedisPool) - 支持连接超时和读写超时配置 - 支持SSL/TLS加密连接 3. **高级功能**: ```java // 管道操作(批量执行命令) try (Pipeline pipeline = jedis.pipelined()) { pipeline.set("key1", "value1"); pipeline.get("key2"); pipeline.sync(); // 一次性发送所有命令 } // 事务支持 Transaction tx = jedis.multi(); tx.set("tx-key", "value"); tx.exec(); ``` 4. **集群支持**: ```java Set<HostAndPort> nodes = new HashSet<>(); nodes.add(new HostAndPort("redis1", 6379)); nodes.add(new HostAndPort("redis2", 6380)); try (JedisCluster cluster = new JedisCluster(nodes)) { cluster.set("cluster-key", "value"); } ``` ### 常见替代方案 1. **Lettuce**: - 基于 Netty 的异步客户端(spring-data-redis 默认) - 依赖:`io.lettuce:lettuce-core` 2. **Redisson**: - 分布式和并发功能更丰富 - 依赖:`org.redisson:redisson` ### 最佳实践建议 1. **生产环境务必使用连接池** 2. **配置合理的超时参数**: ```java new JedisPoolConfig().setMaxWait(Duration.ofSeconds(3)); ``` 3. **使用 try-with-resources 确保资源释放** 4. **在集群环境中使用 JedisCluster 替代单节点连接** ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值