使用CustomizableTraceInterceptor时如何记录Spring Data Repository的实际目标类名

时间:2017-02-09 16:07:36

标签: spring-data spring-data-jpa spring-aop

我的动机是在维护一个大型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()

非常感谢你的帮助。

1 个答案:

答案 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数据存储库也是如此。