Ну, найдено несколько проблем:
Во-первых, прежде всего. Вы смешали простое приложение и конфигурацию Spring и Spring Boot.
Например, эта зависимость:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Уже содержит эти два артефакта:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
Нет необходимости дублировать их (если вам не нужна конкретная версия), поскольку вы используете пакеты spring-boot-starter
.
Тогда ваш класс @SpringBootApplication
должен находиться в корневом каталоге вашего приложения, чтобы рекурсивно сканировать все пакеты, например так (примечание package):
package com;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MainClass {
public static void main(String[] args) {
SpringApplication.run(MainClass.class, args);
}
}
Тогда возникнет проблема с двумя источниками данных.
PostgresqlConfiguration
Изменение
public LocalContainerEntityManagerFactoryBean postgresqlEntityManagerFactory(EntityManagerFactoryBuilder builder) {
return builder
.dataSource(postgresqlDataSource())
.properties(hibernateProperties())
.packages("com.server.entity.postgresql")
.persistenceUnit("postgresqlPU")
.build();
К
@Bean(name = "postgresqlEntityManager")
public LocalContainerEntityManagerFactoryBean postgresqlEntityManagerFactory() {
LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
factoryBean.setDataSource(postgresqlDataSource());
factoryBean.setJpaPropertyMap(hibernateProperties());
factoryBean.setPackagesToScan("com.server.entity.postgresql");
factoryBean.setPersistenceUnitName("postgresqlPU");
HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter();
jpaVendorAdapter.setDatabasePlatform("org.hibernate.dialect.PostgreSQL95Dialect");
factoryBean.setJpaVendorAdapter(jpaVendorAdapter);
return factoryBean;
}
Аналогичным образом сделайте то же самое для SqlserverConfiguration.java class.
В SqlServerQueryDaoImpl.java сделать следующие изменения:
@PersistenceContext(unitName="sqlserverPU")
private EntityManager sqlserverEntityManager;
public SqlServerQueryDaoImpl(@Qualifier("sqlserverEntityManager")EntityManagerFactory sqlserverEntityManager) {
this.sqlserverEntityManager = sqlserverEntityManager.createEntityManager();
session = sqlserverEntityManager.createEntityManager().unwrap(Session.class);
}
Чтобы отключить автоматическую настройку Spring для источника данных (HikariCP проверит его), добавьте в application.properties
следующее:
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
Никаких других изменений не требуется.
Тогда у вас проблема с @Cache
в ваших сущностях. Вы не указали и не добавили поставщика кэша в путь к классу, поэтому он не может найти поставщика и завершается неудачно при запуске. Просто удалите аннотацию @Cache
из DayVisits.java
и IntervalVisits.java
.
Затем добавьте @Transient
к этому установщику:
@Transient
public List<IntervalVisits> getIntervalVisits() {
return intervalVisits;
}
Затем добавьте сеттер в поле week_num
. JPA будет сканировать его.
public void setWeek_num(int week_num) {
this.week_num = week_num;
}
И, наконец, вам нужно добавить реализацию bean-компонента JSONB в classpath:
<dependency>
<groupId>javax.json.bind</groupId>
<artifactId>javax.json.bind-api</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.eclipse</groupId>
<artifactId>yasson</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.json</artifactId>
<version>1.1</version>
</dependency>
После того, как все эти изменения были сделаны, я смог запустить приложение на встроенном Tomcat.
Я бы также предложил избавиться от всех *. Xml файлов конфигурации. Переместите все в application.properties
и прочитайте его оттуда.
В общем, старайтесь свести к минимуму настройку приложения Spring, если вы не полностью понимаете, что делаете. Spring Boot предоставляет множество способов как загрузить ваш проект с минимальными усилиями. Например, в этой статье показан пример приложения Spring Boot с 2 источниками данных: https://medium.com/@joeclever/using-multiple-datasources-with-spring-boot-and-spring-data-6430b00c02e7
В целом, для запуска проекта действительно необходим умеренный рефакторинг.
Удачи с этим.