我正在尝试使用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
接口的情况下,我们还有哪些其他解决方案可以使其工作?
答案 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