我使用的是spring-data-jpa,我试图应用spring cache abstraction。
findByEmail()
方法缓存很好,但是,控制器上的retrieve()
方法上的用户变量spring-data-jpa提供DomainClassConverter
总是查找数据库。
在文档中,它会调用findOne()
来查找资源,但@Cacheable
触发器无法正常工作。
看起来像SimpleJpaRepository
的实现类只调用CrudRepository
而不是我创建的UserRepository
并放置@Cacheable
注释。
除自定义@Cacheable
课程外,有没有办法将findOne()
应用于DomainClassConverter
?
UserController.class
@RequestMapping(method = RequestMethod.GET, value = "/users/{user}")
public ResponseEntity retrieve(@PathVariable User user) {
logger.info("Retrieve: " + user);
return new ResponseEntity(user.toUserResponse(), HttpStatus.OK);
}
UserService.class
public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
@Cacheable("Users")
User findOne(Long id);
@Cacheable("Users")
User findByEmail(String email);
User findByEmailAndPassword(String email, String password);
Long countByEmail(String email);
}
答案 0 :(得分:2)
我已经为您提交并修复了DATACMNS-620。
Spring Data Commons 1.10.0 M1(Fowler)实际上不应该出现这个问题,因为我们转移到Spring Data REST RepositoryInvoker
API,它明确检查了自定义覆盖。我为1.9.x错误修复分支创建了一个修复程序,以便我们为当前版本系列Evans的用户修复此问题。
如果要检查此升级到Spring Data Commons 1.9.0.BUILD-SNAPSHOT或1.10.0.BUILD-SNAPSHOT。如果您正在使用Boot,则只需设置属性spring-data-releasetrain.version
并将其设置为Evans-BUILD-SNAPSHOT
或Fowler-BUILD-SNAPSHOT
。