Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

use modernway to configure multi datasources #1527

Merged
merged 2 commits into from
Nov 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,13 @@
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "java",
"name": "MultiDataSourceMultiTenancyApplicationTest",
"request": "launch",
"mainClass": "com.example.multitenancy.MultiDataSourceMultiTenancyApplicationTest",
"projectName": "multidatasource-multitenancy"
},
Comment on lines +7 to +13
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Align test configuration with other test configurations in the file.

The test configuration is missing standard attributes and doesn't follow the naming pattern used by other test configurations.

Apply this diff to align with other test configurations:

 {
     "type": "java",
-    "name": "MultiDataSourceMultiTenancyApplicationTest",
+    "name": "Spring Boot-TestApplication<multidatasource-multitenancy>",
     "request": "launch",
     "mainClass": "com.example.multitenancy.MultiDataSourceMultiTenancyApplicationTest",
-    "projectName": "multidatasource-multitenancy"
+    "projectName": "multidatasource-multitenancy",
+    "cwd": "${workspaceFolder}",
+    "args": "",
+    "envFile": "${workspaceFolder}/.env"
 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
{
"type": "java",
"name": "MultiDataSourceMultiTenancyApplicationTest",
"request": "launch",
"mainClass": "com.example.multitenancy.MultiDataSourceMultiTenancyApplicationTest",
"projectName": "multidatasource-multitenancy"
},
{
"type": "java",
"name": "Spring Boot-TestApplication<multidatasource-multitenancy>",
"request": "launch",
"mainClass": "com.example.multitenancy.MultiDataSourceMultiTenancyApplicationTest",
"projectName": "multidatasource-multitenancy",
"cwd": "${workspaceFolder}",
"args": "",
"envFile": "${workspaceFolder}/.env"
},

{
"type": "java",
"name": "Spring Boot-Application<boot-reactive-cache>",
Expand Down Expand Up @@ -153,6 +160,16 @@
"projectName": "boot-jndi-sample",
"args": "--spring.profiles.active=local",
"envFile": "${workspaceFolder}/.env"
},
{
"type": "java",
"name": "Spring Boot-Application<multidatasource-multitenancy>",
"request": "launch",
"cwd": "${workspaceFolder}",
"mainClass": "com.example.multitenancy.MultiDataSourceMultiTenancyApplication",
"projectName": "multidatasource-multitenancy",
"args": "",
"envFile": "${workspaceFolder}/.env"
}
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ version: '3.8'
services:

postgresqldb:
image: postgres:16.5-alpine
image: postgres:17.1-alpine
environment:
- POSTGRES_USER=appuser
- POSTGRES_PASSWORD=secret
Expand Down
4 changes: 2 additions & 2 deletions jpa/multitenancy/multidatasource-multitenancy/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.6</version>
<version>3.4.0</version>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codebase verification

Based on the curl results from checking Spring Boot versions, I can see that Spring Boot 3.4.0 is currently at RC1 (Release Candidate 1) stage, with the latest version being 3.4.0-RC1. This confirms that 3.4.0 mentioned in the pom.xml is indeed a pre-release version.

Using Spring Boot 3.4.0 is not recommended for production use

The version 3.4.0 specified in pom.xml is a pre-release version that is still in development. For production use, you should use the latest stable version from the 3.3.x line.

🔗 Analysis chain

Caution: Using Spring Boot milestone version

The upgrade to Spring Boot 3.4.0 uses a milestone release which may not be suitable for production use. Consider using the latest stable version (3.3.x) instead.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check latest stable Spring Boot version and milestone status
curl -s https://repo.spring.io/milestone/org/springframework/boot/spring-boot/maven-metadata.xml | grep -A 2 "<version>3"

# Verify compatibility with current dependencies
rg -l "import org.springframework" | while read -r file; do
  echo "=== $file ==="
  rg "import org.springframework" "$file"
done

Length of output: 200000

<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example.multitenancy</groupId>
Expand All @@ -19,7 +19,7 @@
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

<java.version>21</java.version>
<springdoc-openapi.version>2.6.0</springdoc-openapi.version>
<springdoc-openapi.version>2.7.0-RC1</springdoc-openapi.version>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codebase verification

Consider upgrading springdoc-openapi to stable version 2.3.0

The project uses Spring Boot 3.4.0, and springdoc-openapi 2.7.0-RC1 is not recommended for production use. The latest stable version that's compatible with Spring Boot 3.x is 2.3.0. The OpenAPI annotations are actively used in multiple controllers across the codebase, making this a critical dependency.

  • Replace <springdoc-openapi.version>2.7.0-RC1</springdoc-openapi.version> with <springdoc-openapi.version>2.3.0</springdoc-openapi.version> in pom.xml
🔗 Analysis chain

Review RC version of springdoc-openapi

Using springdoc-openapi 2.7.0-RC1 (release candidate) in production could be risky. Consider:

  1. Using the latest stable version (2.6.0)
  2. Or verify that this RC version is compatible with Spring Boot 3.4.0

Let me gather more information about the Spring Boot version used in the project to verify compatibility.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check latest stable springdoc-openapi version
curl -s "https://search.maven.org/solrsearch/select?q=g:org.springdoc+AND+a:springdoc-openapi-starter-webmvc-ui&rows=5&wt=json" | jq -r '.response.docs[].v' | sort -V

# Find OpenAPI usage in codebase
rg -l "@Operation|@ApiResponse|@Tag" | while read -r file; do
  echo "=== $file ==="
  rg "@Operation|@ApiResponse|@Tag" "$file"
done

Length of output: 2462


Script:

#!/bin/bash
# Check Spring Boot version in pom.xml
rg -A 5 "<parent>" jpa/multitenancy/multidatasource-multitenancy/pom.xml

# Check if there are any springdoc-openapi related issues in the codebase
rg -l "springdoc.*exception|openapi.*error" 

# Check if there are any springdoc-openapi configuration properties
rg "springdoc\." -g "application*.{properties,yml,yaml}"

Length of output: 614


<project.testresult.directory>${project.build.directory}/test-results</project.testresult.directory>
<spotless.version>2.43.0</spotless.version>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@

@SpringBootApplication
@EnableConfigurationProperties({ApplicationProperties.class})
public class Application {
public class MultiDataSourceMultiTenancyApplication {

public static void main(String[] args) {
SpringApplication.run(Application.class, args);
SpringApplication.run(MultiDataSourceMultiTenancyApplication.class, args);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

@ControllerAdvice
@Order(Ordered.HIGHEST_PRECEDENCE)
public class GlobalExceptionHandler {
class GlobalExceptionHandler {

@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import io.swagger.v3.oas.annotations.servers.Server;
import org.springframework.context.annotation.Configuration;

@Configuration
@OpenAPIDefinition(info = @Info(title = "db", version = "v1"), servers = @Server(url = "/"))
public class SwaggerConfig {}
@Configuration(proxyBeanMethods = false)
@OpenAPIDefinition(
info = @Info(title = "multidatasource-multitenancy", version = "v1"),
servers = @Server(url = "/"))
class SwaggerConfig {}
Original file line number Diff line number Diff line change
@@ -1,25 +1,30 @@
package com.example.multitenancy.config;

import com.example.multitenancy.config.multitenant.MultiTenantInterceptor;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Configuration;
import org.springframework.lang.NonNull;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
@RequiredArgsConstructor
public class WebMvcConfig implements WebMvcConfigurer {
@Configuration(proxyBeanMethods = false)
class WebMvcConfig implements WebMvcConfigurer {

private final ApplicationProperties properties;
private final MultiTenantInterceptor multiTenantInterceptor;

WebMvcConfig(ApplicationProperties properties, MultiTenantInterceptor multiTenantInterceptor) {
this.properties = properties;
this.multiTenantInterceptor = multiTenantInterceptor;
}

@Override
public void addInterceptors(InterceptorRegistry registry) {
public void addInterceptors(@NonNull InterceptorRegistry registry) {
registry.addInterceptor(multiTenantInterceptor);
}

@Override
public void addCorsMappings(CorsRegistry registry) {
public void addCorsMappings(@NonNull CorsRegistry registry) {
registry.addMapping(properties.getCors().getPathPattern())
.allowedMethods(properties.getCors().getAllowedMethods())
.allowedHeaders(properties.getCors().getAllowedHeaders())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@

import com.example.multitenancy.config.multitenant.TenantIdentifierResolver;
import com.example.multitenancy.primary.entities.PrimaryCustomer;
import com.example.multitenancy.primary.repositories.PrimaryCustomerRepository;
import com.example.multitenancy.utils.DatabaseType;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import javax.sql.DataSource;
import lombok.RequiredArgsConstructor;
import org.hibernate.cfg.AvailableSettings;
import org.hibernate.context.spi.CurrentTenantIdentifierResolver;
import org.hibernate.engine.jdbc.connections.spi.MultiTenantConnectionProvider;
Expand All @@ -21,17 +21,22 @@
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;

@Configuration
@Configuration(proxyBeanMethods = false)
@EnableJpaRepositories(
basePackages = "com.example.multitenancy.primary.repositories",
basePackageClasses = PrimaryCustomerRepository.class,
entityManagerFactoryRef = "primaryEntityManagerFactory",
transactionManagerRef = "primaryTransactionManager")
@RequiredArgsConstructor
public class PrimaryDataSourceConfiguration {

private final JpaProperties jpaProperties;
private final TenantIdentifierResolver tenantIdentifierResolver;

public PrimaryDataSourceConfiguration(
JpaProperties jpaProperties, TenantIdentifierResolver tenantIdentifierResolver) {
this.jpaProperties = jpaProperties;
this.tenantIdentifierResolver = tenantIdentifierResolver;
}

@Bean(name = "primaryEntityManagerFactory")
LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory(
EntityManagerFactoryBuilder builder,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,17 @@

import com.example.multitenancy.config.multitenant.TenantIdentifierResolver;
import com.example.multitenancy.secondary.entities.SecondaryCustomer;
import com.example.multitenancy.secondary.repositories.SecondaryCustomerRepository;
import com.example.multitenancy.utils.DatabaseType;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import javax.sql.DataSource;
import lombok.RequiredArgsConstructor;
import org.hibernate.cfg.AvailableSettings;
import org.hibernate.context.spi.CurrentTenantIdentifierResolver;
import org.hibernate.engine.jdbc.connections.spi.MultiTenantConnectionProvider;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
Expand All @@ -21,17 +22,23 @@
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;

@Configuration
@Configuration(proxyBeanMethods = false)
@EntityScan(basePackageClasses = SecondaryCustomer.class)
@EnableJpaRepositories(
basePackages = "com.example.multitenancy.secondary.repositories",
basePackageClasses = SecondaryCustomerRepository.class,
entityManagerFactoryRef = "secondaryEntityManagerFactory",
transactionManagerRef = "secondaryTransactionManager")
@RequiredArgsConstructor
public class SecondaryDataSourceConfiguration {

private final JpaProperties jpaProperties;
private final TenantIdentifierResolver tenantIdentifierResolver;

public SecondaryDataSourceConfiguration(
JpaProperties jpaProperties, TenantIdentifierResolver tenantIdentifierResolver) {
this.jpaProperties = jpaProperties;
this.tenantIdentifierResolver = tenantIdentifierResolver;
}

@Bean(name = "secondaryEntityManagerFactory")
LocalContainerEntityManagerFactoryBean secondaryEntityManagerFactory(
EntityManagerFactoryBuilder builder,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,16 @@
import liquibase.UpdateSummaryEnum;
import liquibase.UpdateSummaryOutputEnum;
import liquibase.integration.spring.SpringLiquibase;
import liquibase.ui.UIServiceEnum;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.autoconfigure.liquibase.LiquibaseProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

@Configuration(proxyBeanMethods = false)
public class MultiDatasourceConfig {
Expand Down Expand Up @@ -58,7 +61,10 @@ DataSourceProperties secondaryDataSourceProperties() {
DataSource secondaryDataSource(
@Qualifier("secondaryDataSourceProperties")
DataSourceProperties secondaryDataSourceProperties) {
return secondaryDataSourceProperties.initializeDataSourceBuilder().build();
return secondaryDataSourceProperties
.initializeDataSourceBuilder()
.type(HikariDataSource.class)
.build();
}

@Bean
Expand All @@ -81,15 +87,21 @@ private SpringLiquibase springLiquibase(DataSource dataSource, LiquibaseProperti
liquibase.setDataSource(dataSource);
liquibase.setChangeLog(properties.getChangeLog());
liquibase.setClearCheckSums(properties.isClearChecksums());
liquibase.setContexts(properties.getContexts());
if (!CollectionUtils.isEmpty(properties.getContexts())) {
liquibase.setContexts(
StringUtils.collectionToCommaDelimitedString(properties.getContexts()));
}
liquibase.setDefaultSchema(properties.getDefaultSchema());
liquibase.setLiquibaseSchema(properties.getLiquibaseSchema());
liquibase.setLiquibaseTablespace(properties.getLiquibaseTablespace());
liquibase.setDatabaseChangeLogTable(properties.getDatabaseChangeLogTable());
liquibase.setDatabaseChangeLogLockTable(properties.getDatabaseChangeLogLockTable());
liquibase.setDropFirst(properties.isDropFirst());
liquibase.setShouldRun(properties.isEnabled());
liquibase.setLabelFilter(properties.getLabelFilter());
if (!CollectionUtils.isEmpty(properties.getLabelFilter())) {
liquibase.setLabelFilter(
StringUtils.collectionToCommaDelimitedString(properties.getLabelFilter()));
}
liquibase.setChangeLogParameters(properties.getParameters());
liquibase.setRollbackFile(properties.getRollbackFile());
liquibase.setTestRollbackOnUpdate(properties.isTestRollbackOnUpdate());
Expand All @@ -101,6 +113,9 @@ private SpringLiquibase springLiquibase(DataSource dataSource, LiquibaseProperti
liquibase.setShowSummaryOutput(
UpdateSummaryOutputEnum.valueOf(properties.getShowSummaryOutput().name()));
}
if (properties.getUiService() != null) {
liquibase.setUiService(UIServiceEnum.valueOf(properties.getUiService().name()));
}
return liquibase;
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
spring.application.name=multidatasource-multitenancy
server.port=8080
server.shutdown=graceful
spring.main.allow-bean-definition-overriding=true
spring.jmx.enabled=false

################ Logging #####################
logging.file.name=logs/multidatasource-multitenancy.log
logging.file.name=logs/${spring.application.name}.log
logging.level.web=INFO
logging.level.sql=INFO
## To enable transaction details logging
Expand All @@ -20,7 +19,7 @@ management.endpoint.health.show-details=always
################ Database #####################
spring.jpa.show-sql=true
spring.jpa.open-in-view=false
spring.jpa.hibernate.ddl-auto=validate
spring.jpa.hibernate.ddl-auto=none
#spring.jpa.properties.hibernate.format_sql=true
#spring.jpa.properties.hibernate.hbm2ddl.auto=validate
spring.jpa.properties.hibernate.jdbc.time_zone=UTC
Expand All @@ -30,6 +29,7 @@ spring.jpa.properties.hibernate.order_inserts=true
spring.jpa.properties.hibernate.order_updates=true
spring.jpa.properties.hibernate.query.fail_on_pagination_over_collection_fetch=true
spring.jpa.properties.hibernate.query.in_clause_parameter_padding=true
spring.jpa.properties.hibernate.query.plan_cache_max_size=4096
spring.jpa.properties.hibernate.connection.provider_disables_autocommit=true
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true

Expand All @@ -38,12 +38,14 @@ datasource.primary.username=appuser
datasource.primary.password=secret
datasource.primary.driverClassName=org.postgresql.Driver
datasource.primary.configuration.auto-commit=false
datasource.primary.configuration.pool-name=primaryPool
datasource.primary.liquibase.change-log= classpath:/db/changelog/db.primary.changelog-master.yml
datasource.secondary.url=jdbc:postgresql://localhost:5432/secondary
datasource.secondary.username=appuser
datasource.secondary.password=secret
datasource.secondary.driverClassName=org.postgresql.Driver
datasource.secondary.hikari.auto-commit=false
datasource.secondary.hikari.pool-name=secondaryPool
datasource.secondary.liquibase.change-log= classpath:/db/changelog/db.secondary.changelog-master.yml

spring.mvc.problemdetails.enabled=true
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.23.xsd">
https://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.29.xsd">
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codebase verification

Schema version inconsistency detected across changelog files

The changelog files in the project use different schema versions ranging from 3.1.x to 4.29.x. This inconsistency should be addressed:

  • primary/db.changelog-xml-db.xml: 4.29
  • schema/.../db.changelog-xml-db.xml: 4.20
  • secondary/db.changelog-xml-db.xml: 3.2
  • db.primary.changelog-master.xml: 3.1
  • db.secondary.changelog-master.xml: 3.1

Since the project uses Spring Boot 3.4.0 which includes a recent version of Liquibase core, it's recommended to standardize all changelog files to use the same recent schema version (4.29) to maintain consistency and leverage newer features.

🔗 Analysis chain

Verify Liquibase version compatibility

The schema location has been updated to version 4.29. Let's ensure this matches the Liquibase dependency version in the project.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check Liquibase version in pom.xml
echo "Checking Liquibase version in pom.xml..."
rg -A 1 "liquibase.*version" pom.xml

# Check for other changelog files that might need similar updates
echo -e "\nChecking other changelog files that might need updates..."
fd changelog.*xml$ | xargs grep -l "dbchangelog-4"

Length of output: 603


Script:

#!/bin/bash
# Let's check the content of other changelog files to see their schema versions
echo "Checking schema versions in changelog files..."
for file in $(fd 'changelog.*xml$'); do
    echo -e "\n=== $file ==="
    grep -A 1 "dbchangelog.*xsd" "$file"
done

# Let's also check the parent pom.xml and other pom files for Liquibase version
echo -e "\n=== Checking Liquibase version in all pom files ==="
fd pom.xml$ | xargs grep -A 1 "liquibase.*version"

Length of output: 3961


Script:

#!/bin/bash
# Let's check the parent pom files for Liquibase version property
echo "Checking for Liquibase version property in pom files..."
fd pom.xml$ | xargs grep -B 2 -A 2 "<liquibase\.version>"

# Also check for Liquibase plugin version in the specific project
echo -e "\nChecking Liquibase plugin version in the multitenancy project..."
cat jpa/multitenancy/multidatasource-multitenancy/pom.xml

Length of output: 15980


<changeSet author="raja" id="createSequence-customers-sequence" runOnChange="true">
<preConditions onFail="MARK_RAN">
Expand Down Expand Up @@ -31,7 +31,7 @@
<column name="text" type="varchar(1024)">
<constraints nullable="false"/>
</column>
<column name="version" type="tinyint"/>
<column name="version" type="tinyint" defaultValue="0"/>
<column name="tenant" type="VARCHAR(255)">
<constraints nullable="false" primaryKey="true"/>
</column>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.example.multitenancy;

import com.example.multitenancy.common.ContainersConfiguration;
import com.example.multitenancy.utils.AppConstants;
import org.springframework.boot.SpringApplication;

class MultiDataSourceMultiTenancyApplicationTest {

public static void main(String[] args) {
SpringApplication.from(MultiDataSourceMultiTenancyApplication::main)
.with(ContainersConfiguration.class)
.withAdditionalProfiles(AppConstants.PROFILE_TEST)
.run(args);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@
import org.springframework.test.web.servlet.MockMvc;

@ActiveProfiles({PROFILE_TEST})
@SpringBootTest(webEnvironment = RANDOM_PORT)
@SpringBootTest(webEnvironment = RANDOM_PORT, classes = ContainersConfiguration.class)
@AutoConfigureMockMvc
public abstract class AbstractIntegrationTest extends DBContainerInitializer {
public abstract class AbstractIntegrationTest {

@Autowired protected MockMvc mockMvc;

Expand Down
Loading