2014-03-13 10 views
5

Ich verwende Spring Data 1.5 und Auditing. Teil der AuditingEntityListener hat eine setAuditingHandler Methode.Wie kann ich den von Spring-Data injizierten AuditingHandler anpassen, wenn ich Auditing verwende?

Wie kann ich die AuditingHandler anpassen und Spring-Data anweisen, meine benutzerdefinierte Handler statt der Standard org.springframework.data.auditing.AuditingHandler injizieren?

Ich habe versucht, meine eigene AuditingEntityListener Instantiierung, in der ich meine eigenen Handler injizieren, aber das macht nicht die Arbeit. Der Standardhandler wird noch immer injiziert. Ich habe sowohl über XML-Konfiguration als auch JavaConfig versucht, um zu sehen, ob einer besser funktioniert als der andere, aber keiner von beiden funktioniert.

JavaConfig:

@Configuration 
@EnableJpaAuditing(auditorAwareRef="auditorProvider") 
public class AppConfig { 

    @Bean 
    public AuditorAware<User> auditorProvider(){ 
     return new SpringSecurityAuditorAware(); 
    } 

    @Bean 
    public AuditingEntityListener auditingEntityListener(){ 
     AuditingEntityListener listener = new AuditingEntityListener(); 
     listener.setAuditingHandler(new com.ia.persistence.AuditingHandler()); 
     return listener; 
    } 
} 

Meine benutzerdefinierten Handler:

@Component 
public class AuditingHandler extends org.springframework.data.auditing.AuditingHandler { 

    // SLF4J logger 
    private static final Logger logger = LoggerFactory.getLogger(AuditingHandler.class); 

    /* (non-Javadoc) 
    * @see org.springframework.data.auditing.AuditingHandler#markCreated(java.lang.Object) 
    */ 
    @Override 
    public void markCreated(Object source) { 
     logger.info("Custom handler"); 
     super.markCreated(source); 
    } 

    /* (non-Javadoc) 
    * @see org.springframework.data.auditing.AuditingHandler#markModified(java.lang.Object) 
    */ 
    @Override 
    public void markModified(Object source) { 
     logger.info("Custom handler"); 
     super.markModified(source); 
    } 
} 

Was mache ich falsch? Mit meiner JavaConfig sehe ich nicht, dass Spring den Listener mit meiner Konfiguration instanziiert. Alternativ habe ich versucht, den Listener mithilfe der XML-Konfiguration zu konfigurieren, aber der Standard-Listener wird immer noch verwendet.

<!-- enable Spring data-JPA repositories --> 
    <jpa:repositories base-package="com.ia" /> 

    <bean id="auditingEntityListener" class="org.springframework.data.jpa.domain.support.AuditingEntityListener"> 
     <property name="auditingHandler" ref="auditingHandler"/> 
    </bean> 

Alle Vorschläge wären hilfreich.

+0

Ja, mit Architektur Spring Sie können! – shazin

+0

@shazin Können Sie bitte zusätzliche Details angeben? Ich kann nicht herausfinden, wo/wie ich meine benutzerdefinierte Handler anstelle der Standardhandler angeben. –

Antwort

4

Ich traf die gleiche Frage.

Die kurze Version

Sie haben jpaAuditingHandler Bean Definition registrieren BeanDefinitionRegistry verwenden.

Die lange Version

die org.springframework.data.jpa.domain.support.AuditingEntityListener ist ein Sonderklasse, die mit aspectj mischt beim Kompilieren. siehe here

Es muss eine Bean-Definition funktionieren. siehe das Frühjahrsrahmenpapier.

Die org.springframework.data.jpa.repository.config.EnableJpaAuditing, die Sie verwenden, wird die Bean-Definition mit der auditingHandler-Bindung an eine jpaAuditingHandler-Bean registrieren. Außerdem wird die Bean-Definition jpaAuditingHandler registriert.

Wenn Sie eine jpaAuditingHandler mit @Component hinzufügen, wird es nicht funktionieren, weil Spring eine andere bevorzugen. siehe org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader#loadBeanDefinitionsForConfigurationClass

So müssen Sie Ihre Bean-Definition mit registrieren.

public class jpaAuditingHandlerRegistrar implements ImportBeanDefinitionRegistrar { 
    @Override 
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { 
     registry.registerBeanDefinition("jpaAuditingHandler", BeanDefinitionBuilder 
       .rootBeanDefinition(JpaAuditingHandler.class) 
       .addConstructorArgReference("jpaMappingContext") 
       .getBeanDefinition()); 
    } 
} 

und fügen @Import(JpaAuditingHandlerRegistrar.class) zu Ihrer Konfiguration Klasse

@SpringBootApplication 
@EnableJpaAuditing 
@Import(JpaAuditingHandlerRegistrar.class) 
public class Application { 

Ich habe Codebeispiel https://github.com/macdao/customize-auditing-handler

+0

Das Verlinken zu deinen eigenen Sachen ist [keine gute Antwort] (// stackoverflow.com/help/promotion).Eine gute Antwort, die eine Offsite-Ressource umfasst, enthält die wesentlichen Teile der Antwort für zukünftige Benutzer und verweist auf Folgendes: _Was ist das, worüber Sie sprechen? Wo installiere ich es? Wie installiere ich es? Wie verwende ich dieses Ding, um das ** genaue Problem zu lösen ** habe ich in meiner Frage? Sind Sie mit dieser Sache in irgendeiner Form, Form oder Form verbunden? _ Siehe: [Wie kann ich mich mit einer externen Ressource auf eine gemeinschaftsfreundliche Weise verbinden?] (// meta.stackexchange.com/questions/94022) – Mogsdad

Verwandte Themen