2014-03-13 3 views
5

스프링 데이터 1.5 및 감사를 사용하고 있습니다. AuditingEntityListener의 부분은 setAuditingHandler 메소드를가집니다.감사를 사용할 때 스프링 데이터에 의해 삽입 된 AuditingHandler를 어떻게 커스터마이징 할 수 있습니까?

AuditingHandler을 사용자 정의하고 Spring 데이터에 org.springframework.data.auditing.AuditingHandler 기본값 대신 사용자 정의 처리기를 삽입하도록 지시하려면 어떻게해야합니까?

내 자신의 Handler를 삽입하는 내 AuditingEntityListener을 인스턴스화하려고 시도했지만 그 작업을 수행하지 않습니다. 기본 처리기가 여전히 주입 중입니다. XML 구성과 JavaConfig를 통해 둘 중 하나가 다른 것보다 잘 작동하는지 확인하려고했으나 어느 방법으로도 작동하지 않습니다.

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; 
    } 
} 

내 사용자 정의 핸들러 : 내가 잘못 뭐하는 거지

@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); 
    } 
} 

? 내 JavaConfig에서는 Spring이 내 구성을 사용하여 리스너를 인스턴스화하는 것을 보지 못했습니다. 또는 XML 구성을 사용하여 수신기를 구성하려고 시도했지만 기본 수신기는 여전히 사용됩니다.

<!-- 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> 

어떤 제안이 도움이 될 것입니다.

+0

예를 넣어! – shazin

+0

@shazin 추가 세부 사항을 제공해 주시겠습니까? 어디서/내 기본 처리기 대신 사용자 지정 처리기를 지정하는 방법을 알아낼 수 없습니다. –

답변

4

나는 동일한 질문을 만났다.

당신은 BeanDefinitionRegistry를 사용하여 jpaAuditingHandler 빈 정의를 등록해야

짧은 버전.

긴 버전

org.springframework.data.jpa.domain.support.AuditingEntityListener은 컴파일 할 때 AspectJ를 함께 혼합 특별한 클래스입니다. here

작동하려면 bean 정의가 필요합니다. 스프링 프레임 워크 문서를 참조하십시오.

org.springframework.data.jpa.repository.config.EnableJpaAuditing은 빈 정의를 jpaAuditingHandler bean에 대한 auditingHandler bind와 함께 등록합니다. 또한 빈 정의를 jpaAuditingHandler 등록합니다.

@Component를 사용하여 jpaAuditingHandler을 추가하면 Spring이 다른 것을 선호하기 때문에 @Component가 작동하지 않습니다. org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader#loadBeanDefinitionsForConfigurationClass

BeanDefinitionRegistry을 사용하여 bean 정의를 등록해야합니다. 구성 클래스에

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

및 추가 @Import(JpaAuditingHandlerRegistrar.class)

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

나는 당신이 할 수있는 봄의 아키텍처, 샘플 코드를 https://github.com/macdao/customize-auditing-handler

+0

자신의 물건에 연결하는 것만으로도 [좋은 대답이 아닙니다] (// stackoverflow.com/help/promotion).오프 사이트 리소스를 포함하는 좋은 대답은 미래의 사용자를위한 여기에 대한 대답의 핵심 부분을 포함하며 다음을 참조하십시오 : 당신이 말한 것은 무엇입니까? 어디서 설치합니까? 어떻게 설치합니까? 이 문제를 해결하기 위해 ** 정확한 문제를 해결하려면 ** 어떻게해야합니까? _ 어떤 방식 으로든이 물건에 가입하고 있습니까? _ See : [외부 커뮤니티에 커뮤니티 친화적 인 방법으로 링크하려면 어떻게합니까?] (// meta.stackexchange.com/questions/94022) – Mogsdad