Попробуйте пересмотреть записи выше или определить bean-компонент типа org.springframework.data.redis.core.RedisTemplate в вашей конфигурации. - PullRequest
0 голосов
/ 04 ноября 2018

Я получаю приведенную ниже ошибку при разработке примера Spring Boot + Spring Data Redis. В этом примере я пытаюсь реализовать метод contains, который невозможен в соответствии с документом Spring, и ссылку здесь: Причина: java.lang.IllegalArgumentException: CONTAINING (1): [IsContained, Conisting, Contains] не поддерживается для получения запроса redis - Redis , который извлекает данные согласно соответствующим данным.

***************************
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;
}

Role.java

@Data 
@Builder
@AllArgsConstructor
@NoArgsConstructor
@RedisHash("Role")
public class Role {
    private @Id String id;
    private @Indexed String roleName;
}

1 Ответ

0 голосов
/ 04 ноября 2018

Хорошо, я получил решение. Я должен использовать

@Autowired
private RedisTemplate<Object, Object> redisTemplate;

вместо

@Autowired
private RedisTemplate<String, Object> redisTemplate;
...