2017-08-16 106 views
0

我在演示Spring集成Redis的啓動應用程序。Spring boot + redis

我所提到的各種站點參考,但最後我優選遵循這一:http://www.baeldung.com/spring-data-redis-tutorial

我的代碼是幾乎相同的如上述鏈接給出。唯一的改變是我在RestController類中有自動裝配的StudentRepository。當時

現在,當我嘗試做行家安裝它給了我錯誤

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 

當我試圖保持構造公衆,它會創建成功打造。但我不知道我應該做還是不做。我在想,而不是Autowiring的構造函數,我應該可以做setter注入。我也試過如下:

@Autowired 
private RedisTemplate<String, Student> redisTemplate; 

但它也沒有工作。

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爲如下默認和代碼:

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


} 

春季啓動主入口點的聲明如下:

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

演示控制器測試Redis的是如下:

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

郵** ** studentRepository代碼以及。 –

+0

請把代碼,因爲我沒有訪問教程。 –

+0

你可以把你的代碼推到Github上嗎? – diguage

回答

0

Ch安格以下redis的配置:

您的原始:

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

將其更改爲:

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

它現在應該爲你工作。

0

您設置構造爲私有......其改爲公開

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