JedisUtil这个类 的内部类里没有构造方法xml文件报错
来源:11-4 引入缓存技术之配置讲解
慕运维9271746
2018-08-14
写回答
4回答
-
翔仔
2018-08-15
JedisPoolWripper
package com.imooc.o2o.cache; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; /** * 强指定redis的JedisPool接口构造函数,这样才能在centos成功创建jedispool * * @author xiangze * */ public class JedisPoolWriper { /** Redis连接池对象 */ private JedisPool jedisPool; public JedisPoolWriper(final JedisPoolConfig poolConfig, final String host, final int port) { try { jedisPool = new JedisPool(poolConfig, host, port); } catch (Exception e) { e.printStackTrace(); } } /** * 获取Redis连接池对象 * @return */ public JedisPool getJedisPool() { return jedisPool; } /** * 注入Redis连接池对象 * @param jedisPool */ public void setJedisPool(JedisPool jedisPool) { this.jedisPool = jedisPool; } }
spring-redis.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- Redis连接池的设置 --> <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> <!-- 控制一个pool可分配多少个jedis实例 --> <property name="maxTotal" value="${redis.pool.maxActive}" /> <!-- 连接池中最多可空闲maxIdle个连接 ,这里取值为20,表示即使没有数据库连接时依然可以保持20空闲的连接,而不被清除,随时处于待命状态。 --> <property name="maxIdle" value="${redis.pool.maxIdle}" /> <!-- 最大等待时间:当没有可用连接时,连接池等待连接被归还的最大时间(以毫秒计数),超过时间则抛出异常 --> <property name="maxWaitMillis" value="${redis.pool.maxWait}" /> <!-- 在获取连接的时候检查有效性 --> <property name="testOnBorrow" value="${redis.pool.testOnBorrow}" /> </bean> <!-- 创建Redis连接池,并做相关配置 --> <bean id="jedisWritePool" class="com.imooc.o2o.cache.JedisPoolWriper" depends-on="jedisPoolConfig"> <constructor-arg index="0" ref="jedisPoolConfig" /> <constructor-arg index="1" value="${redis.hostname}" /> <constructor-arg index="2" value="${redis.port}" type="int" /> </bean> <!-- 创建Redis工具类,封装好Redis的连接以进行相关的操作 --> <bean id="jedisUtil" class="com.imooc.o2o.cache.JedisUtil" scope="singleton"> <property name="jedisPool"> <ref bean="jedisWritePool" /> </property> </bean> <!-- Redis的key操作 --> <bean id="jedisKeys" class="com.imooc.o2o.cache.JedisUtil$Keys" scope="singleton"> <constructor-arg ref="jedisUtil"></constructor-arg> </bean> <!-- Redis的Strings操作 --> <bean id="jedisStrings" class="com.imooc.o2o.cache.JedisUtil$Strings" scope="singleton"> <constructor-arg ref="jedisUtil"></constructor-arg> </bean> </beans>
00 -
翔仔
2018-08-15
JedisUtil.java剩下的部分
// *******************************************Strings*******************************************// public class Strings { /** * 根据key获取记录 * * @param String * key * @return 值 */ public String get(String key) { // ShardedJedis sjedis = getShardedJedis(); Jedis sjedis = getJedis(); String value = sjedis.get(key); sjedis.close(); return value; } /** * 根据key获取记录 * * @param byte[] * key * @return 值 */ public byte[] get(byte[] key) { // ShardedJedis sjedis = getShardedJedis(); Jedis sjedis = getJedis(); byte[] value = sjedis.get(key); sjedis.close(); return value; } /** * 添加记录,如果记录已存在将覆盖原有的value * * @param String * key * @param String * value * @return 状态码 */ public String set(String key, String value) { return set(SafeEncoder.encode(key), SafeEncoder.encode(value)); } /** * 添加记录,如果记录已存在将覆盖原有的value * * @param String * key * @param String * value * @return 状态码 */ public String set(String key, byte[] value) { return set(SafeEncoder.encode(key), value); } /** * 添加记录,如果记录已存在将覆盖原有的value * * @param byte[] * key * @param byte[] * value * @return 状态码 */ public String set(byte[] key, byte[] value) { Jedis jedis = getJedis(); String status = jedis.set(key, value); jedis.close(); return status; } /** * 添加有过期时间的记录 * * @param String * key * @param int * seconds 过期时间,以秒为单位 * @param String * value * @return String 操作状态 */ public String setEx(String key, int seconds, String value) { Jedis jedis = getJedis(); String str = jedis.setex(key, seconds, value); jedis.close(); return str; } /** * 添加有过期时间的记录 * * @param String * key * @param int * seconds 过期时间,以秒为单位 * @param String * value * @return String 操作状态 */ public String setEx(byte[] key, int seconds, byte[] value) { Jedis jedis = getJedis(); String str = jedis.setex(key, seconds, value); jedis.close(); return str; } /** * 添加一条记录,仅当给定的key不存在时才插入 * * @param String * key * @param String * value * @return long 状态码,1插入成功且key不存在,0未插入,key存在 */ public long setnx(String key, String value) { Jedis jedis = getJedis(); long str = jedis.setnx(key, value); jedis.close(); return str; } /** * 从指定位置开始插入数据,插入的数据会覆盖指定位置以后的数据<br/> * 例:String str1="123456789";<br/> * 对str1操作后setRange(key,4,0000),str1="123400009"; * * @param String * key * @param long * offset * @param String * value * @return long value的长度 */ public long setRange(String key, long offset, String value) { Jedis jedis = getJedis(); long len = jedis.setrange(key, offset, value); jedis.close(); return len; } /** * 在指定的key中追加value * * @param String * key * @param String * value * @return long 追加后value的长度 **/ public long append(String key, String value) { Jedis jedis = getJedis(); long len = jedis.append(key, value); jedis.close(); return len; } /** * 将key对应的value减去指定的值,只有value可以转为数字时该方法才可用 * * @param String * key * @param long * number 要减去的值 * @return long 减指定值后的值 */ public long decrBy(String key, long number) { Jedis jedis = getJedis(); long len = jedis.decrBy(key, number); jedis.close(); return len; } /** * <b>可以作为获取唯一id的方法</b><br/> * 将key对应的value加上指定的值,只有value可以转为数字时该方法才可用 * * @param String * key * @param long * number 要减去的值 * @return long 相加后的值 */ public long incrBy(String key, long number) { Jedis jedis = getJedis(); long len = jedis.incrBy(key, number); jedis.close(); return len; } /** * 对指定key对应的value进行截取 * * @param String * key * @param long * startOffset 开始位置(包含) * @param long * endOffset 结束位置(包含) * @return String 截取的值 */ public String getrange(String key, long startOffset, long endOffset) { // ShardedJedis sjedis = getShardedJedis(); Jedis sjedis = getJedis(); String value = sjedis.getrange(key, startOffset, endOffset); sjedis.close(); return value; } /** * 获取并设置指定key对应的value<br/> * 如果key存在返回之前的value,否则返回null * * @param String * key * @param String * value * @return String 原始value或null */ public String getSet(String key, String value) { Jedis jedis = getJedis(); String str = jedis.getSet(key, value); jedis.close(); return str; } /** * 批量获取记录,如果指定的key不存在返回List的对应位置将是null * * @param String * keys * @return List<String> 值得集合 */ public List<String> mget(String... keys) { Jedis jedis = getJedis(); List<String> str = jedis.mget(keys); jedis.close(); return str; } /** * 批量存储记录 * * @param String * keysvalues 例:keysvalues="key1","value1","key2","value2"; * @return String 状态码 */ public String mset(String... keysvalues) { Jedis jedis = getJedis(); String str = jedis.mset(keysvalues); jedis.close(); return str; } /** * 获取key对应的值的长度 * * @param String * key * @return value值得长度 */ public long strlen(String key) { Jedis jedis = getJedis(); long len = jedis.strlen(key); jedis.close(); return len; } } }
00 -
翔仔
2018-08-15
为了方便同学调查与解决,我把我的配置和代码分别贴出来。
JedisUtil.java
package com.imooc.o2o.cache; import java.util.List; import java.util.Map; import java.util.Set; import redis.clients.jedis.BinaryClient.LIST_POSITION; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.SortingParams; import redis.clients.util.SafeEncoder; public class JedisUtil { /** * 缓存生存时间 */ private final int expire = 60000; /** 操作Key的方法 */ public Keys KEYS; /** 对存储结构为String类型的操作 */ public Strings STRINGS; /** 对存储结构为List类型的操作 */ public Lists LISTS; /** 对存储结构为Set类型的操作 */ public Sets SETS; /** 对存储结构为HashMap类型的操作 */ public Hash HASH; /** Redis连接池对象 */ private JedisPool jedisPool; /** * 获取redis连接池 * * @return */ public JedisPool getJedisPool() { return jedisPool; } /** * 设置redis连接池 * * @return */ public void setJedisPool(JedisPoolWriper jedisPoolWriper) { this.jedisPool = jedisPoolWriper.getJedisPool(); } /** * 从jedis连接池中获取获取jedis对象 * * @return */ public Jedis getJedis() { return jedisPool.getResource(); } /** * 设置过期时间 * * @author xiangze * @param key * @param seconds */ public void expire(String key, int seconds) { if (seconds <= 0) { return; } Jedis jedis = getJedis(); jedis.expire(key, seconds); jedis.close(); } /** * 设置默认过期时间 * * @author xiangze * @param key */ public void expire(String key) { expire(key, expire); } // *******************************************Keys*******************************************// public class Keys { /** * 清空所有key */ public String flushAll() { Jedis jedis = getJedis(); String stata = jedis.flushAll(); jedis.close(); return stata; } /** * 更改key * * @param String * oldkey * @param String * newkey * @return 状态码 */ public String rename(String oldkey, String newkey) { return rename(SafeEncoder.encode(oldkey), SafeEncoder.encode(newkey)); } /** * 更改key,仅当新key不存在时才执行 * * @param String * oldkey * @param String * newkey * @return 状态码 */ public long renamenx(String oldkey, String newkey) { Jedis jedis = getJedis(); long status = jedis.renamenx(oldkey, newkey); jedis.close(); return status; } /** * 更改key * * @param String * oldkey * @param String * newkey * @return 状态码 */ public String rename(byte[] oldkey, byte[] newkey) { Jedis jedis = getJedis(); String status = jedis.rename(oldkey, newkey); jedis.close(); return status; } /** * 设置key的过期时间,以秒为单位 * * @param String * key * @param 时间 * ,已秒为单位 * @return 影响的记录数 */ public long expired(String key, int seconds) { Jedis jedis = getJedis(); long count = jedis.expire(key, seconds); jedis.close(); return count; } /** * 设置key的过期时间,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00,格里高利历)的偏移量。 * * @param String * key * @param 时间 * ,已秒为单位 * @return 影响的记录数 */ public long expireAt(String key, long timestamp) { Jedis jedis = getJedis(); long count = jedis.expireAt(key, timestamp); jedis.close(); return count; } /** * 查询key的过期时间 * * @param String * key * @return 以秒为单位的时间表示 */ public long ttl(String key) { // ShardedJedis sjedis = getShardedJedis(); Jedis sjedis = getJedis(); long len = sjedis.ttl(key); sjedis.close(); return len; } /** * 取消对key过期时间的设置 * * @param key * @return 影响的记录数 */ public long persist(String key) { Jedis jedis = getJedis(); long count = jedis.persist(key); jedis.close(); return count; } /** * 删除keys对应的记录,可以是多个key * * @param String * ... keys * @return 删除的记录数 */ public long del(String... keys) { Jedis jedis = getJedis(); long count = jedis.del(keys); jedis.close(); return count; } /** * 删除keys对应的记录,可以是多个key * * @param String * ... keys * @return 删除的记录数 */ public long del(byte[]... keys) { Jedis jedis = getJedis(); long count = jedis.del(keys); jedis.close(); return count; } /** * 判断key是否存在 * * @param String * key * @return boolean */ public boolean exists(String key) { // ShardedJedis sjedis = getShardedJedis(); Jedis sjedis = getJedis(); boolean exis = sjedis.exists(key); sjedis.close(); return exis; } /** * 对List,Set,SortSet进行排序,如果集合数据较大应避免使用这个方法 * * @param String * key * @return List<String> 集合的全部记录 **/ public List<String> sort(String key) { // ShardedJedis sjedis = getShardedJedis(); Jedis sjedis = getJedis(); List<String> list = sjedis.sort(key); sjedis.close(); return list; } /** * 对List,Set,SortSet进行排序或limit * * @param String * key * @param SortingParams * parame 定义排序类型或limit的起止位置. * @return List<String> 全部或部分记录 **/ public List<String> sort(String key, SortingParams parame) { // ShardedJedis sjedis = getShardedJedis(); Jedis sjedis = getJedis(); List<String> list = sjedis.sort(key, parame); sjedis.close(); return list; } /** * 返回指定key存储的类型 * * @param String * key * @return String string|list|set|zset|hash **/ public String type(String key) { // ShardedJedis sjedis = getShardedJedis(); Jedis sjedis = getJedis(); String type = sjedis.type(key); sjedis.close(); return type; } /** * 查找所有匹配给定的模式的键 * * @param String * key的表达式,*表示多个,?表示一个 */ public Set<String> keys(String pattern) { Jedis jedis = getJedis(); Set<String> set = jedis.keys(pattern); jedis.close(); return set; } }
太长了 我把set list hash这些都去掉了,项目中也没用到
00 -
翔仔
2018-08-15
同学好,请检查redis pom里面对应的版本,同时可以尝试新创建一个同名的spring-redis.xml空的文件,将这些数据原封不懂粘贴到那边,然后删除掉原来的这个spring-redis.xml clean一下工程试试
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.imooc</groupId> <artifactId>o2o</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>o2o Maven Webapp</name> <url>http://maven.apache.org</url> <properties> <spring.version>4.3.7.RELEASE</spring.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> <!-- Spring --> <!-- 1)包含Spring 框架基本的核心工具类。Spring 其它组件要都要使用到这个包里的类,是其它组件的基本核心 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <!-- 2)这个jar 文件是所有应用都要用到的,它包含访问配置文件、创建和管理bean 以及进行Inversion of Control / Dependency Injection(IoC/DI)操作相关的所有类。如果应用只需基本的IoC/DI 支持,引入spring-core.jar 及spring-beans.jar 文件就可以了。 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <!-- 3)这个jar 文件为Spring 核心提供了大量扩展。可以找到使用Spring ApplicationContext特性时所需的全部类,JDNI 所需的全部类,instrumentation组件以及校验Validation 方面的相关类。 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <!-- 4) 这个jar 文件包含对Spring 对JDBC 数据访问进行封装的所有类。 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <!-- 5) 为JDBC、Hibernate、JDO、JPA等提供的一致的声明式和编程式事务管理。 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <!-- 6)Spring web 包含Web应用开发时,用到Spring框架时所需的核心类,包括自动载入WebApplicationContext特性的类、Struts与JSF集成类、文件上传的支持类、Filter类和大量工具辅助类。 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <!-- 7)包含SpringMVC框架相关的所有类。 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <!-- 8)Spring test 对JUNIT等测试框架的简单封装 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> <scope>test</scope> </dependency> <!-- Servlet web --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> </dependency> <!-- json解析 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.8.7</version> </dependency> <!-- Map工具类 对标准java Collection的扩展 spring-core.jar需commons-collections.jar --> <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> <version>3.2</version> </dependency> <!-- DAO: MyBatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.2</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.1</version> </dependency> <!-- 数据库 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.37</version> </dependency> <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1.2</version> </dependency> <!-- 图片处理 --> <!-- https://mvnrepository.com/artifact/net.coobird/thumbnailator --> <dependency> <groupId>net.coobird</groupId> <artifactId>thumbnailator</artifactId> <version>0.4.8</version> </dependency> <!-- https://mvnrepository.com/artifact/com.github.penggle/kaptcha --> <dependency> <groupId>com.github.penggle</groupId> <artifactId>kaptcha</artifactId> <version>2.3.2</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.2</version> </dependency> <!-- redis客户端:Jedis --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency> </dependencies> <build> <finalName>o2o</finalName> <plugins> <plugin> <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-compiler-plugin --> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.6.1</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF8</encoding> </configuration> </plugin> </plugins> </build> </project>
022018-08-15
相似问题