我如何使用Spring应用程序中的密钥在Redis缓存中将缓存的mysql数据作为单个项目读取

时间:2019-09-09 05:59:22

标签: mysql spring-boot gradle redis

在第一次运行中缓存单个项目数据后,后续运行会产生一个无法转换为错误的问题。我想解决将单个项目数据存储在缓存中后获取单个项目的问题。

这是一个gradle Spring应用程序,它将数据存储在MySQL数据库中,并使用redis作为缓存管理器。

服务实施程序类

@Autowired
    private ClientRepository clientRepository;
//This doesn't work
    @Override
    @Cacheable(value = "clientCache", key = "{#clientId}")
    public Client getClientById(long clientId) {
        System.out.println("--- Inside getClientById() ---");
        return clientRepository.findById(clientId).get();
    }

//This works
    @Override
    @Cacheable(value = "allClientsCache")
    public List<Client> getAllClients() {
        System.out.println("--- Inside getAllClients() ---");
        List<Client> list = new ArrayList<>();
        clientRepository.findAll().forEach(e -> list.add(e));
        return list;
    }

控制器类

@GetMapping("/client/{clientId}")
    @ResponseBody
    public ResponseEntity<Client> getClientById (@PathVariable Long clientId){
        Client client = clientService.getClientById(clientId);
        return new ResponseEntity<>(client, HttpStatus.OK);
    }
@GetMapping("/clients")
    public ResponseEntity<List<Client>> getAllClients() {
        List<Client> list = clientService.getAllClients();
        return new ResponseEntity<>(list, HttpStatus.OK);
    }

REDIS CONFIG CLASS

@Autowired
   private Environment env;

   @Bean
   public LettuceConnectionFactory redisConnectionFactory() {
        RedisStandaloneConfiguration redisConf = new RedisStandaloneConfiguration();
        return new LettuceConnectionFactory(redisConf);
   }

   @Bean
   public RedisCacheManager cacheManager() {
        RedisCacheManager rcm = RedisCacheManager.create(redisConnectionFactory());
        rcm.setTransactionAware(true);
        return rcm;
   }

    @Bean
    public RedisTemplate<?, ?> redisTemplate() {
        final RedisTemplate<?, ?> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory());
        redisTemplate.setEnableTransactionSupport(true);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        return redisTemplate;
    }

我希望在浏览器上我会看到一个json客户端数据

查询单个项目时显示的错误是:

    There was an unexpected error (type=Internal Server Error, status=500).
com.example.redis.Models.ClientModel.Client cannot be cast to com.example.redis.Models.ClientModel.Client
java.lang.ClassCastException: com.example.redis.Models.ClientModel.Client cannot be cast to com.example.redis.Models.ClientModel.Client
    at com.example.redis.ServiceImplementers.Client.ClientServiceImpl$$EnhancerBySpringCGLIB$$4620f242.getClientById(<generated>)
    at com.example.redis.Controllers.ClientController.ClientController.getClientById(ClientController.java:23)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:892)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1039)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:897)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:118)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:853)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1587)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)

在终端上,redis将项目存储为

redis 127.0.0.1:6379> mget "clientCache::2"
1) "\xac\xed\x00\x05sr\x00\x1ecom.example.redis.Model.Client\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\nI\x00\x06activeJ\x00\bclientIdI\x00\x0bclient_codeI\x00\ncountry_idJ\x00\x06msisdnI\x00\x05phoneL\x00\aaddresst\x00\x12Ljava/lang/String;L\x00\x0bclient_nameq\x00~\x00\x01L\x00\x0bdescriptionq\x00~\x00\x01L\x00\x05emailq\x00~\x00\x01xp\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\a\x9b\x00\x00\x00\x03\x00\x00\x00hI\xa8\x00N)\xcb\xfcHt\x00\aKampalat\x00\x0cMTN Holdingst\x03wLorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.t\x00\x0fkainfo@host.com"

1 个答案:

答案 0 :(得分:0)