我的动机是在维护一个大型Spring Data Jpa项目期间很容易找到,该项目使用sql生成Repository方法。
我在GitHub spring-data-examples中有CustomerRepository
。
我将CustomizableTraceInterceptor
更改为:
public @Bean CustomizableTraceInterceptor interceptor() {
CustomizableTraceInterceptor interceptor = new CustomizableTraceInterceptor();
interceptor.setHideProxyClassNames(true);
interceptor.setEnterMessage("Entering $[targetClassShortName].$[methodName]()");
return interceptor;
}
我想在日志中看到:
Entering CustomerRepository.save()
但我得到了:
Entering SimpleJpaRepository.save()
非常感谢你的帮助。
答案 0 :(得分:0)
我通过扩展CustomizableTraceInterceptor解决了这个问题:
import org.springframework.aop.framework.AopProxyUtils;
import org.springframework.aop.interceptor.CustomizableTraceInterceptor;
import org.springframework.data.jpa.repository.support.SimpleJpaRepository;
public class MethodTraceInterceptor extends CustomizableTraceInterceptor {
@Override
protected Class<?> getClassForLogging(Object target) {
Class<?> classForLogging = super.getClassForLogging(target);
if (SimpleJpaRepository.class.equals(classForLogging)) {
Class<?>[] interfaces = AopProxyUtils.proxiedUserInterfaces(target);
if (interfaces.length > 0) {
return interfaces[0];
}
}
return classForLogging;
}
}
但我觉得奇怪的是,这种重写是必要的。理想情况下,Spring跟踪拦截器应该解析类以便正确记录,即使对于spring数据存储库也是如此。