Не удается получить результат от Redis с помощью репозитория Crud в Spring Boot? - PullRequest
0 голосов
/ 02 ноября 2018

Я разрабатываю Spring Boot + Redis пример. Я взял ссылку по ссылке: https://www.baeldung.com/spring-data-redis-tutorial. В этом примере я разработал метод репозитория Student findByNameAndGender(String name, Gender gender); и даже Student findByName(String name);, но я не получаю никакого результата в обоих случаях .?

Быстрая помощь? Запрос Redis -

redis 127.0.0.1:6379> KEYS *
1) "Student"
2) "Student:bb4df14a-7f42-4fc3-b608-fc4b7d45109e"
3) "Student:69affaa4-e56c-49e3-9ef4-1cd7509d299b"
redis 127.0.0.1:6379>

Student.java

@Data
@AllArgsConstructor
@Builder
@NoArgsConstructor
@RedisHash("Student")
public class Student {
    public enum Gender {
        MALE, FEMALE
    }

    private String id;
    private String name;
    private Gender gender;
    private int grade;
}

StudentRepository.java

@Repository
public interface StudentRepository extends CrudRepository<Student, String>{
    Student findByNameAndGender(String name, Gender gender);
}

RedisConfig.java

@Configuration
@EnableRedisRepositories
public class RedisConfig {
    @Bean
    JedisConnectionFactory jedisConnectionFactory() {
        return new JedisConnectionFactory();
    }
    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        final RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
        template.setConnectionFactory(jedisConnectionFactory());
        template.setValueSerializer(new GenericToStringSerializer<Object>(Object.class));
        return template;
    }
}

SpringDataRedisEugenpApplication.java

@SpringBootApplication
public class SpringDataRedisEugenpApplication implements CommandLineRunner{

    @Autowired
    private StudentRepository repository;

    public static void main(String[] args) {
        SpringApplication.run(SpringDataRedisEugenpApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        repository.save(Student.builder().name("John").gender(Student.Gender.MALE).grade(1).build());
        repository.save(Student.builder().name("Michael").gender(Student.Gender.MALE).grade(2).build());

        Iterable<Student> students = repository.findAll();
        for (Student student : students) {
            System.out.println("=============================");
            System.out.println("Details ? "+student.toString());
        }

        Student s = repository.findByNameAndGender("John", Student.Gender.MALE);
        System.out.println("Student ="+s.toString());  //line-34
    }
}

Ошибка -

java.lang.IllegalStateException: Failed to execute CommandLineRunner
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:795) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
    at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:776) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1242) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1230) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
    at com.baeldung.SpringDataRedisEugenpApplication.main(SpringDataRedisEugenpApplication.java:19) [classes/:na]
Caused by: java.lang.NullPointerException: null
    at com.baeldung.SpringDataRedisEugenpApplication.run(SpringDataRedisEugenpApplication.java:34) [classes/:na]
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:792) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
    ... 5 common frames omitted

Несколько запросов -

1) Как посмотреть фактические данные, хранящиеся в Redis?

2) Как мы можем контролировать Id для запуска с одного?

edis 127.0.0.1:6379> get Student:1
(error) ERR Operation against a key holding the wrong kind of value
redis 127.0.0.1:6379> get Student:2
(error) ERR Operation against a key holding the wrong kind of value
redis 127.0.0.1:6379>

Я действительно изо всех сил пытаюсь увидеть

redis 127.0.0.1:6379> mget Student:1
1) (nil)
redis 127.0.0.1:6379> mget Student:2
1) (nil)
redis 127.0.0.1:6379> mget Student
1) (nil)

enter image description here

1 Ответ

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

Я сам смог найти ответы на следующие вопросы.

Вам просто нужно поместить аннотацию @Index на уровне поля. @Index аннотации помечают свойство как для индексации, которая использует Redis {@literal SET} для отслеживания объектов с совпадающими значениями.

@Indexed
private String name;

@ Ref: https://scalegrid.io/blog/introduction-to-redis-data-structures-hashes/

1) Как посмотреть фактические данные, хранящиеся в Redis?

redis 127.0.0.1:6379> hgetall Student:1
 1) "_class"
 2) "com.baeldung.spring.data.redis.model.Student"
 3) "id"
 4) "1"
 5) "name"
 6) "John Doe"
 7) "gender"
 8) "MALE"
 9) "grade._class"
10) "java.lang.Integer"
11) "grade"
12) "1"

redis 127.0.0.1:6379> hgetall Student:2
 1) "_class"
 2) "com.baeldung.spring.data.redis.model.Student"
 3) "id"
 4) "2"
 5) "name"
 6) "Michael Harford"
 7) "gender"
 8) "MALE"
 9) "grade._class"
10) "java.lang.Integer"
11) "grade"
12) "2"
...