Spring Boot с двумя источниками данных + envers - PullRequest
0 голосов
/ 06 февраля 2019

Я использую Springboot версии 2.1.2 и MSSQL Server в качестве источника данных.Когда я использовал только один источник данных, у меня не было проблем с envers.Аудит работает отлично.Но когда проекту требуется два источника данных, envers не сотрудничает.Мне нужен аудит только для первого источника данных.

Вот конфиг:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
    basePackages = { "com.sample.app.repository", "com.sample.app.security.repository" },
    repositoryFactoryBeanClass = EnversRevisionRepositoryFactoryBean.class
)
public class MainDbConfig {
    @Bean
    @Primary
    @ConfigurationProperties("spring.datasource")
    public DataSourceProperties appDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean
    @Primary
    @ConfigurationProperties("spring.datasource.hikari")
    public HikariDataSource appDataSource() {
        return mainDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build();
    }

    @Primary
    @Bean(name = "entityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(
        EntityManagerFactoryBuilder builder, @Qualifier("appDataSource") DataSource dataSource) {
        return builder
            .dataSource(dataSource)
            .packages("com.sample.app.model", "com.sample.app.security.model", "com.sample.app.audit")
            .persistenceUnit("app")
            .build();
    }

    @Primary
    @Bean(name = "transactionManager")
    public PlatformTransactionManager transactionManager(
        @Qualifier("entityManagerFactory") EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }
}

и

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
    entityManagerFactoryRef = "otherEntityManagerFactory",
    transactionManagerRef = "otherTransactionManager",
    basePackages = {"com.sample.other.repository"}
)
public class OtherDbConfig {
    @Bean
    @ConfigurationProperties(prefix = "other.datasource")
    public DataSourceProperties otherDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean
    @ConfigurationProperties("other.datasource.hikari")
    public HikariDataSource otherDataSource() {
        return otherDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build();
    }

    @Bean(name = "otherEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(
        EntityManagerFactoryBuilder builder, @Qualifier("otherDataSource") DataSource dataSource) {
        return builder
            .dataSource(dataSource)
            .packages("com.sample.other.model")
            .persistenceUnit("other")
            .build();
    }

    @Primary
    @Bean(name = "otherTransactionManager")
    public PlatformTransactionManager transactionManager(
        @Qualifier("otherEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }
}

Все хорошо при доступе к 2 источникам данных, до аудитаприходит пользовательский прослушиватель:

public class AuditRevisionListener implements RevisionListener {
     @Value("${jwt.header:Authorization}")
     private String tokenHeader;
     @Autowired
     private TokenUtil jwtTokenUtil;

     @Override
     public void newRevision(Object revisionEntity) {
         AuditRevisionEntity auditRevisionEntity = (AuditRevisionEntity) revisionEntity;
         HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
         String username =  jwtTokenUtil.getUsernameFromToken(request.getHeader("X-Auth-Token"));
         auditRevisionEntity.setUsername(username);
     }
 }

tokenHeader не заполняется, TokenUtil не инициализируется.Когда я использовал один источник данных, все работает хорошо.

Любая помощь будет оценена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...