如何在接口

时间:2018-05-24 10:07:27

标签: spring interface crud spring-cache

我正在尝试使用Spring-JPA,如下面的代码所示。

@Repository
public interface EmployeeCrud extends CrudRepository<Employee, Integer> {
    @Cacheable(cacheNames = "emp_by_last_name, key = "#lastName")
    List<Employee> findAllByLastName(@Param("lastName") String lastName);
}

由于接口没有参数名称(除非在启用调试信息的情况下编译),因为以下异常,我无法获取数据。

 java.lang.IllegalArgumentException: Null key returned for cache operation (maybe you are using named params on classes without debug info?) Builder[public abstract java.util.List EmployeeCrud.findAllByLastName(java.lang.String)] caches=[emp_by_last_name] | key='#lastName' | keyGenerator='' | cacheManager='' | cacheResolver='' | condition='' | unless='' | sync='false'
at org.springframework.cache.interceptor.CacheAspectSupport.generateKey(CacheAspectSupport.java:561)
at org.springframework.cache.interceptor.CacheAspectSupport.findCachedItem(CacheAspectSupport.java:502)
at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:389)
at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:327)
at org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:61)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)

即使我使用@Param@P注释,CacheOperationExpressionEvaluator仍然无法解决,因为它使用内部使用DefaultParameterNameDiscoverer和{{StandardReflectionParameterNameDiscoverer的{​​{1}} 1}}。 如果它曾经使用过LocalVariableTableParameterNameDiscoverer,那么AnnotationParameterNameDiscoverer就会被解析。

在不启用编译器调试信息或实现@Param接口的情况下,我们还有哪些其他解决方案可以使其工作?

1 个答案:

答案 0 :(得分:0)

轻松!如果未启用调试信息,您可以按位置引用参数,例如此...

  mycallback <- function(value) {
    test_var=value
  }

有关详细信息,请参阅Reference Documentation

另外,因为@Cacheable(cacheNames = "emp_by_last_name, key = "#a0") List<Employee> findAllByLastName(@Param("lastName") String lastName); @Cacheable Repository方法只有一个参数,所以你不需要显式调出键来存储值(即方法返回值,在这种情况下)缓存中的findAllByLastName(..))(&#34; List<Employee>&#34;),因为默认情况下, Spring的缓存抽象使用方法参数可缓存的方法作为关键。请参阅here

您还应该注意这样一个事实,即缓存的结果(即键/值)将是整个Employee对象列表。如果您正在寻找的话,List的元素将不会单独缓存。如果您需要此功能,请参阅我在{1}以上的其他帖子。

希望这有帮助。

干杯! -John