开发Spring Boot + Spring Data Redis示例时出现以下错误。在此示例中,我正在寻求实现contains按spring doc不可能实现的方法,并在此处链接:[原因:java.lang.IllegalArgumentException:CONTAINING(1):Redis查询不支持IsContaining,Containing,Contains]派生 Redis将根据匹配的详细信息提取数据。
Spring Boot + Spring Data Redis
contains
*************************** APPLICATION FAILED TO START *************************** Description: Field redisTemplate in com.baeldung.MainAppDemo required a bean of type 'org.springframework.data.redis.core.RedisTemplate' that could not be found. The injection point has the following annotations: - @org.springframework.beans.factory.annotation.Autowired(required=true) The following candidates were found but could not be injected: - Bean method 'redisTemplate' in 'RedisAutoConfiguration' not loaded because @ConditionalOnMissingBean (names: redisTemplate; SearchStrategy: all) found beans named redisTemplate Action: Consider revisiting the entries above or defining a bean of type 'org.springframework.data.redis.core.RedisTemplate' in your configuration.
我已经实现了如下 MainAppDemo.java的* 方法 *
@SpringBootApplication public class MainAppDemo implements CommandLineRunner{ @Autowired private UserRepository userRepository; @Autowired private RedisTemplate<String, Object> redisTemplate; public static void main(String[] args) { SpringApplication.run(MainAppDemo.class, args); } @Override public void run(String... args) throws Exception { Role role1 = Role.builder().id("R1").roleName("ADMIN").build(); User user1 = User.builder().firstName("Matt").middleName("Mike").lastName("Wixson").role(role1).build(); Role role2 = Role.builder().id("R2").roleName("API").build(); User user2 = User.builder().firstName("John").middleName("Lima").lastName("Kerr").role(role2).build(); userRepository.save(user1); userRepository.save(user2); List<User> u = userRepository.findByFirstNameAndLastName("Matt", "Wixson"); System.out.println("Find By First Name and Last Name = "+u.toString()); final String key = String.format("user:%s", "J"); final String firstName = (String) redisTemplate.opsForHash().get(key, "firstName"); final String middleName = (String) redisTemplate.opsForHash().get(key, "middleName"); final String lastName = (String) redisTemplate.opsForHash().get(key, "lastName"); User user = User.builder().firstName(firstName).middleName(middleName).lastName(lastName).build(); System.out.println("Custom Redis Template Example ="+user.toString()); List<User> adminUser = userRepository.findByRole_RoleName("ADMIN"); System.out.println("ADMIN USER ="+adminUser); } }
RedisConfig.java
@Configuration @ConfigurationProperties @EnableRedisRepositories("com.baeldung.spring.data.redis.repository") public class RedisConfig { @Bean JedisConnectionFactory jedisConnectionFactory() { return new JedisConnectionFactory(); } @Bean RedisTemplate<Object, Object> redisTemplate() { final RedisTemplate<Object, Object> template = new RedisTemplate<>(); template.setConnectionFactory(jedisConnectionFactory()); template.setKeySerializer(new StringRedisSerializer()); template.setHashValueSerializer(new GenericToStringSerializer<Object>(Object.class)); template.setValueSerializer(new GenericToStringSerializer<Object>(Object.class)); return template; } }
User.java
@Data @Builder @AllArgsConstructor @NoArgsConstructor @RedisHash("user") public class User { private @Id String id; private @Indexed String firstName; private @Indexed String middleName; private @Indexed String lastName; private Role role; }
角色.java
@Data @Builder @AllArgsConstructor @NoArgsConstructor @RedisHash("Role") public class Role { private @Id String id; private @Indexed String roleName; }
好的,我找到了解决方案。我应该用
@Autowired private RedisTemplate<Object, Object> redisTemplate;
代替
@Autowired private RedisTemplate<String, Object> redisTemplate;