2014-11-02 2 views
1

Я пытаюсь найти лучший подход к добавлению второго источника данных в наше приложение. Основная цель состоит в том, чтобы разоблачить CRUD ops против db через rest, & нужно отскочить от 2-го db для проверки подлинности и управления ролью. Мы не используем конфигурации XML.Добавление второго источника данных - SpringBoot RepositoryRestService PersistenceConfig

Есть ли способ просто добавить второй источник данных в существующий файл PersistenceConfig.java, или нам нужно реплицировать весь класс конфигурации для второго экземпляра db?

упаковка foo;

import foo.config.PersistenceConfig; 
import foo.config.RepositoryRestConfig; 
import foo.config.WebConfig; 
import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.Import; 
import org.springframework.data.jpa.repository.config.EnableJpaRepositories; 

@Configuration 
@ComponentScan 
@EnableJpaRepositories 
@Import({PersistenceConfig.class, WebConfig.class, RepositoryRestConfig.class}) 
@EnableAutoConfiguration 
public class Application { 

    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 

} 

РЭПО:

package foo.repository; 

import foo.Widget; 
import org.springframework.data.repository.CrudRepository; 
import org.springframework.data.repository.query.Param; 
import org.springframework.data.rest.core.annotation.RepositoryRestResource; 

import java.util.List; 

@RepositoryRestResource(collectionResourceRel = "widgets", path = "widgets") 
public interface WidgetsRepository extends CrudRepository<Widget, Long> { 
    List<Widget> findByWidgetId(@Param("widgetid") long widgetId); 
} 

Сохранение конфигурации:

package foo.config; 

import org.apache.commons.dbcp2.BasicDataSource; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.Import; 
import org.springframework.context.annotation.Primary; 
import org.springframework.data.jpa.repository.config.EnableJpaRepositories; 
import org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration; 
import org.springframework.orm.jpa.JpaDialect; 
import org.springframework.orm.jpa.JpaTransactionManager; 
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; 
import org.springframework.orm.jpa.vendor.Database; 
import org.springframework.orm.jpa.vendor.HibernateJpaDialect; 
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; 
import org.springframework.transaction.PlatformTransactionManager; 
import org.springframework.transaction.annotation.EnableTransactionManagement; 

import javax.persistence.PersistenceContext; 
import javax.sql.DataSource; 


@Configuration 
@Import(RepositoryRestMvcConfiguration.class) 
@EnableJpaRepositories 
@EnableTransactionManagement 

public class PersistenceConfig { 

    @Bean 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 
     final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); 
     vendorAdapter.setDatabase(Database.SQL_SERVER); 
     vendorAdapter.setShowSql(true); 

     final LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean(); 
     factory.setJpaVendorAdapter(vendorAdapter); 
     factory.setPackagesToScan("foo.model"); 
     factory.setDataSource(dataSource()); 
     return factory; 
    } 

    @Bean(destroyMethod = "close") 
    public DataSource dataSource() { 
     BasicDataSource dataSource = new BasicDataSource(); 
     dataSource.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 
     dataSource.setUrl("jdbc:sqlserver://127.0.0.1:1433;databaseName=fooDB"); 
     dataSource.setUsername("sa"); 
     dataSource.setPassword("*******"); 
     dataSource.setTestOnBorrow(true); 
     dataSource.setTestOnReturn(true); 
     dataSource.setTestWhileIdle(true); 
     dataSource.setTimeBetweenEvictionRunsMillis(1800000L); 
     dataSource.setNumTestsPerEvictionRun(3); 
     dataSource.setMinEvictableIdleTimeMillis(1800000L); 
     dataSource.setValidationQuery("SELECT 1"); 
     return dataSource; 
    } 


    @Bean 
    public JpaDialect jpaDialect() { 
     return new HibernateJpaDialect(); 
    } 

    @Bean 
    public PlatformTransactionManager transactionManager() { 
     JpaTransactionManager txManager = new JpaTransactionManager(); 
     txManager.setEntityManagerFactory(entityManagerFactory().getObject()); 
     return txManager; 
    } 

} 

Спасибо за вашу помощь ...

ответ

0

Посмотрите на @Qualifier аннотацию. С помощью этой аннотации вы можете определить различные бобы одного типа и назначить им имена. Он эквивалентен параметру id в теге bean XML.

Это relevant part of Spring documentation.

0

Прежде всего, стоит отметить, что почти вся конфигурация в PersistenceConfig избыточна, так как Spring Boot автоматически настроит ее для вас. В значительной степени единственное, что не является дефолтом, и вам нужно указать, это ваша конфигурация DataSource, например URL-адрес SQLServer.

Там в section in the documentation, который описывает, как настроить два DataSources с помощью @Primary и application.properties:

Создание более одного источника данных работает так же, как и создание первого. Вы можете отметить один из них, как @Primary, если вы используете автоматическую настройку по умолчанию для JDBC или JPA (то, что один будет подобран любым @Autowired инъекций).»

@Bean 
@Primary 
@ConfigurationProperties(prefix="datasource.primary") 
public DataSource primaryDataSource() { 
    return DataSourceBuilder.create().build(); 
} 

@Bean 
@ConfigurationProperties(prefix="datasource.secondary") 
public DataSource secondaryDataSource() { 
    return DataSourceBuilder.create().build(); 
} 

Вы «d затем настроить эти два DataSources с помощью application.properties и datasource.primary и datasource.secondary префиксы:

Например:

datasource.primary.jdbcUrl=jdbc:sqlserver://127.0.0.1:1433;databaseName=fooDB 
datasource.primary.user=sa 
datasource.primary.password=secret 

datasource.primary.jdbcUrl=jdbc:sqlserver://127.0.0.1:1433;databaseName=barDB 
datasource.primary.user=sa 
datasource.primary.password=secret 
+4

Но вы не объяснить, как использовать вторичные для конкретного reposi tory CrudRepository. При этом у вас есть два источника данных, но вы всегда используете Primary. – PhoneixS

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