2017-02-09 1 views
1

Ma motivation est de trouver facilement lors de la maintenance d'un grand projet Spring Data Jpa quelle méthode Repository a généré sql. J'ai CustomerRepository comme dans GitHub spring-data-examples.Comment enregistrer le nom de la classe cible réelle pour Spring Data Repository lors de l'utilisation de CustomizableTraceInterceptor

j'ai changé CustomizableTraceInterceptor à:

public @Bean CustomizableTraceInterceptor interceptor() { 
    CustomizableTraceInterceptor interceptor = new CustomizableTraceInterceptor(); 
    interceptor.setHideProxyClassNames(true); 
    interceptor.setEnterMessage("Entering $[targetClassShortName].$[methodName]()"); 
    return interceptor; 
} 

Je voudrais voir dans le journal:

Entering CustomerRepository.save() 

mais j'obtenir:

Entering SimpleJpaRepository.save() 

Merci beaucoup Pour votre aide.

Répondre

0

Je résolu le problème en étendant 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; 
    } 
} 

mais je trouve étrange que cette absolue est nécessaire. Idéalement, les intercepteurs de trace Spring devraient résoudre la classe pour la journalisation correctement, même pour les dépôts de données de printemps.