2017-08-16 3 views
0

Je travaille démo Application de démarrage de printemps avec intégration de Redis.Spring boot + redis

J'ai mentionné diverses références du site, mais enfin je préférais suivre ceci: http://www.baeldung.com/spring-data-redis-tutorial

Mon code est presque même comme indiqué dans le lien ci-dessus. Seul changement est que j'ai automatisé StudentRepository dans ma classe RestController.

Maintenant, lorsque je tente de faire maven-installer à ce moment-là, il me donne l'erreur que

java.lang.IllegalStateException: Failed to load ApplicationContext 
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'studentController': Unsatisfied dependency expressed through field 'studentRepository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'studentRepositoryImpl' defined in file [/home/klevu/work/Nimesh/Spring Boot Workspace/bootDemo/target/classes/com/example/demo/redis/repository/StudentRepositoryImpl.class]: Initialization of bean failed; nested exception is org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class com.example.demo.redis.repository.StudentRepositoryImpl]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: No visible constructors in class com.example.demo.redis.repository.StudentRepositoryImpl 

Quand j'ai essayé de garder public constructeur, il crée construire avec succès. Mais je ne sais pas que je devrais le faire ou pas ici. Je pensais que plutôt que le constructeur Autowiring, je devrais être capable de faire l'injection de setter. J'ai également essayé ci-dessous:

@Autowired 
private RedisTemplate<String, Student> redisTemplate; 

Mais cela ne fonctionne pas non plus.

package com.example.demo.redis.repository; 

import java.util.Map; 

import javax.annotation.PostConstruct; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.data.redis.core.HashOperations; 
import org.springframework.data.redis.core.RedisTemplate; 
import org.springframework.stereotype.Repository; 

import com.example.demo.redis.bean.Student; 

@Repository 
public class StudentRepositoryImpl implements StudentRepository { 

    private static final String KEY = "Student"; 

    //@Autowired 
    private RedisTemplate<String, Student> redisTemplate; 

    private HashOperations<String, String, Student> hashOps; 

    @Autowired 
    private StudentRepositoryImpl(RedisTemplate redisTemplate) { 
     this.redisTemplate = redisTemplate; 
    } 

    @PostConstruct 
    private void init() { 
     hashOps = redisTemplate.opsForHash(); 
    } 

    @Override 
    public void saveStudent(Student person) { 
     hashOps.put(KEY, person.getId(), person); 
    } 

    @Override 
    public void updateStudent(Student person) { 
     hashOps.put(KEY, person.getId(), person); 
    } 

    @Override 
    public Student findStudent(String id) { 
     return hashOps.get(KEY, id); 
    } 

    @Override 
    public Map<String, Student> findAllStudents() { 
     return hashOps.entries(KEY); 
    } 

    @Override 
    public void deleteStudent(String id) { 
     hashOps.delete(KEY, id); 
    } 
} 

RedisConfiguration sont par défaut et le code ci-dessous:

package com.example.demo.configuration; 

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; 
import org.springframework.data.redis.core.RedisTemplate; 

@Configuration 
public class RedisConfiguration { 

    @Bean 
    JedisConnectionFactory jedisConnectionFactory() { 
     return new JedisConnectionFactory(); 
    } 

    @Bean 
    public RedisTemplate<String, Object> redisTemplate(){ 
     RedisTemplate<String, Object> template = new RedisTemplate<String, Object>(); 
     template.setConnectionFactory(jedisConnectionFactory()); 
     return template; 
    } 


} 

botte ressort principal point d'entrée est déclarée comme suit:

package com.example.demo; 

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; 
import org.springframework.data.redis.repository.configuration.EnableRedisRepositories; 

@SpringBootApplication 
@EnableMongoRepositories(basePackages = {"com.example.demo.mongo.repository"}) 
@EnableRedisRepositories(basePackages = {"com.example.demo.redis.repository"}) 
public class BootDemoApplication { 

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

contrôleur Demo pour Redis de test est comme ci-dessous:

package com.example.demo.controller; 

import java.util.Map; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.http.HttpStatus; 
import org.springframework.http.ResponseEntity; 
import org.springframework.web.bind.annotation.GetMapping; 
import org.springframework.web.bind.annotation.PathVariable; 
import org.springframework.web.bind.annotation.RequestBody; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.RestController; 

import com.example.demo.redis.bean.Student; 
import com.example.demo.redis.repository.StudentRepository; 

@RestController 
@RequestMapping("/student") 
public class StudentController { 

    @Autowired 
    private StudentRepository studentRepository; 

    @GetMapping 
    public ResponseEntity<Map<String, Student>> index() { 
     Map<String, Student> students = studentRepository.findAllStudents(); 
     return new ResponseEntity<Map<String, Student>>(students, HttpStatus.OK); 
    } 

    @RequestMapping(method = RequestMethod.GET, value = "/{id}") 
    public ResponseEntity<Student> getStudentById(@PathVariable("id") String id) { 
     Student student = studentRepository.findStudent(id); 
     return new ResponseEntity<Student>(student, HttpStatus.OK); 
    } 

    @RequestMapping(method = RequestMethod.POST) 
    public ResponseEntity<Student> saveStudent(@RequestBody Student student) { 
     studentRepository.saveStudent(student); 
     return new ResponseEntity<Student>(student, HttpStatus.CREATED); 
    } 

    @RequestMapping(method = RequestMethod.PUT, value = "/{id}") 
    public ResponseEntity<Student> updateStudent(@RequestBody Student student) { 
     studentRepository.updateStudent(student); 
     return new ResponseEntity<Student>(student, HttpStatus.OK); 
    } 

    @RequestMapping(method = RequestMethod.DELETE, value = "/{id}") 
    public ResponseEntity<Student> deleteMessage(@PathVariable("id") String id) { 
     studentRepository.deleteStudent(id); 
     return new ResponseEntity<Student>(HttpStatus.OK); 
    } 
} 
+0

Post ** studentRepository ** code. –

+0

pls mettre le code que je n'ai pas accès au tutoriel. –

+0

Pouvez-vous envoyer votre code à Github? – diguage

Répondre

0

Ch ange de la configuration Redis suivante:

Votre origine:

@Bean 
public RedisTemplate<String, Object> redisTemplate() { 
    ... 
} 

Modifier à:

@Bean 
public RedisTemplate<String, ?> redisTemplate(){ 
    ... 
} 

Il devrait fonctionner pour vous.

0

Vous définissez le constructeur comme privés ... changer pour le public

@Autowired 
public StudentRepositoryImpl(RedisTemplate redisTemplate) { 
    this.redisTemplate = redisTemplate; 
}