Я пытаюсь использовать 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
иLocalVariableTableParameterNameDiscoverer
.Если бы он также использовал AnnotationParameterNameDiscoverer
, @Param
был бы проанализирован.
Какие еще решения нам нужно, чтобы эта работа работала без включения отладочной информации компилятора или реализации интерфейса EmployeeCrud
?