Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么@Cacheable在控制器和接口中使用时不起作用_Java_Spring_Spring Boot - Fatal编程技术网

Java 为什么@Cacheable在控制器和接口中使用时不起作用

Java 为什么@Cacheable在控制器和接口中使用时不起作用,java,spring,spring-boot,Java,Spring,Spring Boot,springboot 1.5 主要 @EnableCachingproxyTargetClass=true @SpringBoot应用程序 @MapperScanvalue={com.spring15.mapper,com.spring15.cache.mapper} 公共类LearnManager应用程序{ 公共静态无效字符串[]args{ SpringApplication.runLearnMainApplication.class,args; } } 控制器 @PostMapping(&q

springboot 1.5

主要

@EnableCachingproxyTargetClass=true @SpringBoot应用程序 @MapperScanvalue={com.spring15.mapper,com.spring15.cache.mapper} 公共类LearnManager应用程序{ 公共静态无效字符串[]args{ SpringApplication.runLearnMainApplication.class,args; } } 控制器

@PostMapping("/emp/get")
//@Cacheable(cacheNames = "employee", key = "#id", condition = "#id>0", unless = "#result == null")
public Employee getEmp(@RequestBody Employee employee){
  logger.info("====== get ======");
  return cacheService.getEmp(employee.getId());
}
迈巴蒂斯映射器

公共接口EmployeeMapper{ @选择Select*from employee,其中id={id} 员工GetEmployeeById集成器id; //@CachePutcacheNames=员工 @Updateupdate员工集id={id},lastName={lastName},email={email},dId={dId},gender={gender},其中id={id} int updateEmployee雇员; //@CacheReceiveCacheNames=员工 @Deletedelete from employee,其中id={id} 整数id; //@CacheablecacheNames=员工 @将插入插入插入employeelastName、email、dId、性别值{lastName}、{email}、{dId}、{SEXT} int insertEmpEmployee员工; } 服务

@服务 //@CacheConfigcacheNames=employee 公共类缓存服务{ @自动连线 EmployeeMapper EmployeeMapper; //@CacheablecacheNames=employee,key=id,condition=id>0,除非=result==null 公共雇员getEmpInteger id{ 返回employeeMapper.getEmployeeById; } } 邮递员发送了邮寄请求,然后得到以下结果:

@服务中使用的可缓存

第二次从缓存中获取员工的数据

@服务 //@CacheConfigcacheNames=employee 公共类缓存服务{ @自动连线 EmployeeMapper EmployeeMapper; @CacheablecacheNames=employee,key=id,condition=id>0,除非=result==null 公共雇员getEmpInteger id{ 返回employeeMapper.getEmployeeById; } } @可缓存控制器

@PostMapping("/emp/get")
//@Cacheable(cacheNames = "employee", key = "#id", condition = "#id>0", unless = "#result == null")
public Employee getEmp(@RequestBody Employee employee){
  logger.info("====== get ======");
  return cacheService.getEmp(employee.getId());
}
始终从数据库获取员工的数据。 @Cacheable不起作用

@后映射/emp/get @CacheablecacheNames=employee,key=id,condition=id>0,除非=result==null 公职人员getEmp@RequestBody雇员雇员{ logger.info=get=; 返回cacheService.getEmpemployee.getId; } @mapper中使用的Cacheable

始终从数据库获取员工的数据。 @Cacheable不起作用

公共接口EmployeeMapper{ @CacheablecacheNames=employee,key=a0,condition=id>0,除非=result==null @选择Select*from employee,其中id={id} 员工GetEmployeeById集成器id; //@CachePutcacheNames=员工 @Updateupdate员工集id={id},lastName={lastName},email={email},dId={dId},gender={gender},其中id={id} int updateEmployee雇员; //@CacheReceiveCacheNames=员工 @Deletedelete from employee,其中id={id} 整数id; //@CacheablecacheNames=员工 @将插入插入插入employeelastName、email、dId、性别值{lastName}、{email}、{dId}、{SEXT} int insertEmpEmployee员工; } 为什么??他们的区别是什么?

公共雇员getEmp@RequestBody雇员雇员{ logger.info=get=; 返回cacheService.getEmpemployee.getId; } 对于控制器,方法签名不包含id作为参数,因此@Cacheable将无法工作,因为缺少缓存密钥。它有一个Employee作为参数,而不是int-id。因此缓存键应该是Employee.id以使用正确的缓存键

MyBatis映射器不是由Spring管理的,而是由MyBatis管理的,将Spring注释添加到非Spring管理的bean将不会导致任何应用。它将缓存更新计数,而不是缓存雇员,而是以雇员为键的int返回值,而不是值