title: Spring boot 2.0.0 multiple databases (data sources)
body: <p>I want to connect two databases with Spring Boot project. Everything was fine until I migrated to 2.0.0 version. I found some configuration settings but it doesn't work for me.</p>
  
  <p>I am using Oracle database as remote DB and H2 database as file-based local database.</p>
  
  <p>CODE:</p>
  
  <p>REMOTE DATABASE - ORACLE</p>
  
  <pre><code>@Configuration
  @EnableTransactionManagement
  @EnableJpaRepositories(entityManagerFactoryRef = "remotedbEntityManagerFactory", basePackages = {"com.stravovani.DB.RemoteDB.Repository"})
  public class RemoteDBConfig {
  
      @Value("${datasource.stravovani.maxPoolSize:10}")
      private int maxPoolSize;
  
      @Primary
      @Bean(name = "remotedbDataSource")    
      @ConfigurationProperties(prefix = "remotedb.datasource")
      public DataSourceProperties dataSourceProperties(){
          return new DataSourceProperties();
      }
  
      @Primary
      @Bean
      public DataSource dataSource() {
          DataSourceProperties dataSourceProperties = dataSourceProperties();
          HikariDataSource dataSource = (HikariDataSource)
                  DataSourceBuilder
                          .create(dataSourceProperties.getClassLoader())
                          .driverClassName(dataSourceProperties.getDriverClassName())
                          .url(dataSourceProperties.getUrl())
                          .username(dataSourceProperties.getUsername())
                          .password(dataSourceProperties.getPassword())
                          .type(HikariDataSource.class)
                          .build();
          dataSource.setMaximumPoolSize(maxPoolSize);
          return dataSource;
      }
  
  
      @Primary
      @Bean(name = "remotedbEntityManagerFactory")
      public LocalContainerEntityManagerFactoryBean entityManagerFactory()
              throws NamingException {
          LocalContainerEntityManagerFactoryBean factoryBean = new
                  LocalContainerEntityManagerFactoryBean();
          factoryBean.setDataSource(dataSource());
          factoryBean.setPackagesToScan("com.stravovani.DB.RemoteDB.Model");
          factoryBean.setJpaVendorAdapter(jpaVendorAdapter());
          return factoryBean;
      }
  
      @Primary
      @Bean
      public JpaVendorAdapter jpaVendorAdapter() {
          HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new
                  HibernateJpaVendorAdapter();
          return hibernateJpaVendorAdapter;
      }
  
      @Primary
      @Bean
      @Autowired
      public PlatformTransactionManager
      transactionManager(@Qualifier("remotedbEntityManagerFactory") EntityManagerFactory emf) {
          JpaTransactionManager txManager = new JpaTransactionManager();
          txManager.setEntityManagerFactory(emf);
          return txManager;
      }
  }
  </code></pre>
  
  <p>LOCAL DATABASE - H2</p>
  
  <pre><code>@Configuration
  @EnableTransactionManagement
  @EnableJpaRepositories(entityManagerFactoryRef = "localdbEntityManagerFactory", transactionManagerRef = "localdbTransactionManager", basePackages = {"com.stravovani.DB.LocalDB.Repository"})
  public class LocalDBConfig {
  
      @Value("${datasource.stravovani.maxPoolSize:10}")
      private int maxPoolSize;
  
      @Bean(name = "localdbDataSource")
      @ConfigurationProperties(prefix = "localdb.datasource")
      public DataSourceProperties dataSourceProperties(){
          return new DataSourceProperties();
      }
  
      @Bean
      public DataSource dataSource() {
          DataSourceProperties dataSourceProperties = dataSourceProperties();
          HikariDataSource dataSource = (HikariDataSource)
                  DataSourceBuilder
                          .create(dataSourceProperties.getClassLoader())
                          .driverClassName(dataSourceProperties.getDriverClassName())
                          .url(dataSourceProperties.getUrl())
                          .username(dataSourceProperties.getUsername())
                          .password(dataSourceProperties.getPassword())
                          .type(HikariDataSource.class)
                          .build();
          dataSource.setMaximumPoolSize(maxPoolSize);
          return dataSource;
      }
  
      @Bean(name = "localdbEntityManagerFactory")
      public LocalContainerEntityManagerFactoryBean entityManagerFactory()
              throws NamingException {
          LocalContainerEntityManagerFactoryBean factoryBean = new
                  LocalContainerEntityManagerFactoryBean();
          factoryBean.setDataSource(dataSource());
          factoryBean.setPackagesToScan("com.stravovani.DB.LocalDB.Model");
          factoryBean.setJpaVendorAdapter(jpaVendorAdapter());
          return factoryBean;
      }
  
      @Bean
      public JpaVendorAdapter jpaVendorAdapter() {
          HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new
                  HibernateJpaVendorAdapter();
          return hibernateJpaVendorAdapter;
      }
  
      @Bean
      @Autowired
      public PlatformTransactionManager
      transactionManager(@Qualifier("localdbEntityManagerFactory") EntityManagerFactory emf) {
          JpaTransactionManager txManager = new JpaTransactionManager();
          txManager.setEntityManagerFactory(emf);
          return txManager;
      }
  }
  </code></pre>
  
  <p>APPLICATION PROPERTIES</p>
  
  <pre><code>spring.data.rest.basePath=/api
  spring.cache.type=NONE
  spring.jpa.hibernate.ddl-auto=update
  spring.jpa.show-sql=true
  spring.h2.console.enabled=true
  spring.h2.console.path=/localDB
  
  # Oracle - CIT DB
  remotedb.datasource.url= ************************
  remotedb.datasource.username=*********
  remotedb.datasource.password=****************
  remotedb.datasource.driver-class-name=oracle.jdbc.OracleDriver
  
  # H2 - Local DB
  localdb.datasource.url=jdbc:h2:file:./localDB
  localdb.datasource.username=************
  localdb.datasource.password=*********************
  localdb.datasource.driverClassName=org.h2.Driver
  </code></pre>
  
  <p>ERROR:</p>
  
  <pre><code>2018-03-09 21:57:16.707 ERROR 10812 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause
  
  java.lang.NullPointerException: null
      at com.stravovani.MVC.Controller.CardController.test(CardController.java:19) ~[classes/:na]
      at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
      at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
      at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
      at java.base/java.lang.reflect.Method.invoke(Method.java:564) ~[na:na]
      at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:209) ~[spring-web-5.0.4.RELEASE.jar:5.0.4.RELEASE]
      at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136) ~[spring-web-5.0.4.RELEASE.jar:5.0.4.RELEASE]
      at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102) ~[spring-webmvc-5.0.4.RELEASE.jar:5.0.4.RELEASE]
      at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:870) ~[spring-webmvc-5.0.4.RELEASE.jar:5.0.4.RELEASE]
      at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:776) ~[spring-webmvc-5.0.4.RELEASE.jar:5.0.4.RELEASE]
      at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.0.4.RELEASE.jar:5.0.4.RELEASE]
      at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991) ~[spring-webmvc-5.0.4.RELEASE.jar:5.0.4.RELEASE]
      at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925) ~[spring-webmvc-5.0.4.RELEASE.jar:5.0.4.RELEASE]
      at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:978) ~[spring-webmvc-5.0.4.RELEASE.jar:5.0.4.RELEASE]
      at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:870) ~[spring-webmvc-5.0.4.RELEASE.jar:5.0.4.RELEASE]
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:635) ~[tomcat-embed-core-8.5.28.jar:8.5.28]
      at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:855) ~[spring-webmvc-5.0.4.RELEASE.jar:5.0.4.RELEASE]
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) ~[tomcat-embed-core-8.5.28.jar:8.5.28]
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-8.5.28.jar:8.5.28]
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.28.jar:8.5.28]
      at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) ~[tomcat-embed-websocket-8.5.28.jar:8.5.28]
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.28.jar:8.5.28]
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.28.jar:8.5.28]
      at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) ~[spring-web-5.0.4.RELEASE.jar:5.0.4.RELEASE]
      at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.0.4.RELEASE.jar:5.0.4.RELEASE]
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.28.jar:8.5.28]
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.28.jar:8.5.28]
      at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:109) ~[spring-web-5.0.4.RELEASE.jar:5.0.4.RELEASE]
      at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.0.4.RELEASE.jar:5.0.4.RELEASE]
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.28.jar:8.5.28]
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.28.jar:8.5.28]
      at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81) ~[spring-web-5.0.4.RELEASE.jar:5.0.4.RELEASE]
      at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.0.4.RELEASE.jar:5.0.4.RELEASE]
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.28.jar:8.5.28]
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.28.jar:8.5.28]
      at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) ~[spring-web-5.0.4.RELEASE.jar:5.0.4.RELEASE]
      at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.0.4.RELEASE.jar:5.0.4.RELEASE]
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.28.jar:8.5.28]
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.28.jar:8.5.28]
      at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) ~[tomcat-embed-core-8.5.28.jar:8.5.28]
      at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-8.5.28.jar:8.5.28]
      at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:496) [tomcat-embed-core-8.5.28.jar:8.5.28]
      at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) [tomcat-embed-core-8.5.28.jar:8.5.28]
      at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) [tomcat-embed-core-8.5.28.jar:8.5.28]
      at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [tomcat-embed-core-8.5.28.jar:8.5.28]
      at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) [tomcat-embed-core-8.5.28.jar:8.5.28]
      at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803) [tomcat-embed-core-8.5.28.jar:8.5.28]
      at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.28.jar:8.5.28]
      at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790) [tomcat-embed-core-8.5.28.jar:8.5.28]
      at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459) [tomcat-embed-core-8.5.28.jar:8.5.28]
      at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.28.jar:8.5.28]
      at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) [na:na]
      at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) [na:na]
      at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.28.jar:8.5.28]
      at java.base/java.lang.Thread.run(Thread.java:844) [na:na]
  </code></pre>
  
  <p><strong>UPDATE</strong></p>
  
  <p>CARD CONTROLLER:</p>
  
  <pre><code>@RestController
  public class CardController
  {
      @Autowired
      public I_CardService i_CardService;
      public CardRepositoryRemote cardRepositoryRemote;
  
      @GetMapping("/test")
      public String test(){
          return cardRepositoryRemote.findCardByKartaId("0261549783").toString();
      }
  
      @PostMapping("/checkcard")
      public @ResponseBody String checkCard(@RequestBody CardRemote cardRemote)
      {
          return i_CardService.checkCard(cardRemote.getKartaId());
      }
  
      @PostMapping("/savecardtolocaldb")
      public @ResponseBody String saveCardToLocalDB(@RequestBody CardLocal cardLocal){
          return i_CardService.saveCardToLocalDB(cardLocal);
      }
  
      @GetMapping("/movedata")
      public String moveData(){
          i_CardService.moveData();
          return "Moved";
      }
  }
  </code></pre>
  
  <p>REPOSITORY:</p>
  
  <pre><code>    @Repository
  public interface CardRepositoryRemote extends JpaRepository&lt;CardRemote, String&gt;
  {
      CardRemote findCardByKartaId(@Param("kartaId") String kartaId);
  }
  </code></pre>
  
  <p>MODEL WITH LOMBOK:</p>
  
  <pre><code>@Data
  @Entity
  @Table(name = "Record")
  public class CardLocal
  {
      @Id
      @Column(name = "ID")
      @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="LOCAL_SEQ")
      @SequenceGenerator(name="LOCAL_SEQ", sequenceName="LOCAL_SEQ", allocationSize=1)
      private Long ID;
  
      @Column(name = "CARDID")
      private String kartaID;
  
      @Column(name = "DATE", insertable = false)
      private String date;
  
      @Column(name = "FOODTYPE")
      private String typJidla;
  
      @Column(name = "MOVED", insertable = false)
      private boolean moved;
  
      public CardLocal() {    }
  
      public CardLocal(String kartaID, String typJidla) {
          this.kartaID = kartaID;
          this.typJidla = typJidla;
      }
  }
  </code></pre>