2017-08-16 132 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; 
}