2017-02-09 2 views
1

Моя мотивация заключается в том, чтобы легко узнать при обслуживании большого проекта Spring Data Jpa, с помощью которого был создан метод репозитория с учетом sql.Как зарегистрировать фактическое имя целевого класса для хранилища данных Spring при использовании CustomizableTraceInterceptor

У меня CustomerRepository как в GitHub spring-data-examples.

Я изменил 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

Я решил эту проблему, простирающейся 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 должны правильно разрешать класс для ведения журнала, даже для хранилищ данных весны.

Смежные вопросы