Spring Boot에서 모든 데이터베이스 관련 자동 구성 비활성화
저는 Spring Boot를 사용하여 두 개의 애플리케이션을 개발하고 있는데, 하나는 서버 역할을하고 다른 하나는 클라이언트 앱입니다. 그러나 둘 다 활성 프로필에 따라 다르게 작동하는 동일한 앱입니다. 내 애플리케이션을 구성하기 위해 Spring Boot의 자동 구성 기능을 사용하고 있습니다.
데이터베이스 연결이 필요하지 않으므로 클라이언트 앱에서 모든 데이터베이스 관련 자동 구성을 비활성화하고 싶습니다. 애플리케이션은 데이터베이스와의 연결을 설정하거나 SpringData 또는 Hibernate 기능을 사용하려고 시도해서는 안됩니다. 데이터베이스 자동 구성의 활성화 또는 비활성화는 조건부이며 앱의 활성 프로필을 기반으로해야합니다.
각 프로필에 대해 두 개의 서로 다른 application.properties 파일을 만들어이를 수행 할 수 있습니까?
나는 이것을 내 속성 파일에 추가하려고 시도했습니다.
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration\
org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration\
org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration
그러나 응용 프로그램은 시작시 데이터베이스에 연결을 시도합니다. 이러한 예외가 내 요구 사항을 충족하는 데 충분합니까?
비슷한 일을하는 방법은 다음과 같습니다.
@Configuration
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
@Profile ("client_app_profile_name")
public class ClientAppConfiguration {
//it can be left blank
}
서버 앱에 대해 유사한 것을 작성하십시오 (제외 제외).
마지막 단계는 메인 스프링 부트 클래스에서 자동 구성을 비활성화하는 것입니다.
@SpringBootApplication
public class SomeApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(SomeApplication.class);
}
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(SomeApplication.class);
}
}
변경 : 다음 @SpringBootApplication
으로 :
@Configuration
@ComponentScan
이것은 일을해야합니다. 이제 예제에서 제외한 종속성이 불완전 할 수 있습니다. 나에게는 충분했지만 데이터베이스 관련 라이브러리를 완전히 비활성화하는 것이 확실하지 않습니다. 아래 목록을 확인하십시오.
도움이되는 희망
모든 데이터베이스 관련 자동 구성을 비활성화하고 다음에서 종료합니다.
데이터베이스 유형 NONE에 대한 임베디드 데이터베이스 드라이버 클래스를 판별 할 수 없습니다.
1. 주석 사용 :
@SpringBootApplication
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
public class Application {
public static void main(String[] args) {
SpringApplication.run(PayPalApplication.class, args);
}
}
2. Application.properties 사용 :
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
클래스를 구분하기 위해 쉼표를 잊어 버린 것 같습니다. 따라서 구성에 따라 다음이 작동합니다.
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\
org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration
또는 다음과 같이 정의 할 수도 있습니다.
spring.autoconfigure.exclude[0]=org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
spring.autoconfigure.exclude[1]=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
spring.autoconfigure.exclude[2]=org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration
spring.autoconfigure.exclude[3]=org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration
나를위한 방법은
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
Spring boot를 실행하는 클래스에 대한 주석 (`@SpringBootApplication으로 표시됨).
마지막으로 다음과 같습니다.
@SpringBootApplication
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
public class Application{
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@SpringBootApplication
주석을 사용하여 특정 자동 구성 클래스를 제외하는 방법이 있습니다 .
@Import(MyPersistenceConfiguration.class)
@SpringBootApplication(exclude = {
DataSourceAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class,
HibernateJpaAutoConfiguration.class})
public class MySpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(MySpringBootApplication.class, args);
}
}
@SpringBootApplication#exclude
attribute는 속성의 별칭이며 @EnableAutoConfiguration#exclude
오히려 편리하고 유용합니다. 사용자 지정 데이터베이스 구성을 적용하는 방법을 보여주기 위해 예제에
추가 @Import(MyPersistenceConfiguration.class)
했습니다.
프로필을 통해 제어하는 또 다른 방법은 다음과 같습니다.
// note: no @SpringApplication annotation here
@Import(DatabaseConfig.class)
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@Configuration
@Import({DatabaseConfig.WithDB.class, DatabaseConfig.WithoutDB.class})
public class DatabaseConfig {
@Profile("!db")
@EnableAutoConfiguration(
exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class,
HibernateJpaAutoConfiguration.class})
static class WithoutDB {
}
@Profile("db")
@EnableAutoConfiguration
static class WithDB {
}
}
위에서 언급 한 모든 솔루션을 수행 한 경우에도이 오류가 발생했습니다.
by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfig ...
At some point when i look up the POM there was this dependency in it
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
And the Pojo class had the following imports
import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id;
Which clearly shows the application was expecting a datasource.
What I did was I removed the JPA dependency from pom and replaced the imports for the pojo with the following once
import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document;
Finally I got SUCCESSFUL build. Check it out you might have run into the same problem
'developer tip' 카테고리의 다른 글
JavaScript를 사용하여 브라우저 버전과 운영 체제를 감지하는 방법은 무엇입니까? (0) | 2020.08.28 |
---|---|
Python 사전을 JSON 배열로 변환 (0) | 2020.08.28 |
Python에서 파일 읽기 및 덮어 쓰기 (0) | 2020.08.28 |
Android SQLite : 삽입 / 바꾸기 메서드의 nullColumnHack 매개 변수 (0) | 2020.08.28 |
Mongoid 및 mongodb와의 관계를 통해 has_many를 구현하는 방법은 무엇입니까? (0) | 2020.08.28 |