前段時間我找到了解決方案,但是我忘記了在這裏分享,所以謝謝Jan提醒我。
我通過創建和註冊用具有不同構造(RepositoryRestMvcConfiguration)和一個公共的父這是Spring啓動應用程序的根應用上下文新的web應用程序上下文幾個調度員的servlet解決它。要根據類路徑中包含的不同jar來自動啓用API模塊,我模擬了Spring Boot或多或少做了什麼。
該項目分爲幾個gradle模塊。事情是這樣的:
- 項目服務器
- 項目-API自動配置
- 項目模塊-A-API
- 項目模塊-B-API
- ...
- project-module-n-api
該模塊項目服務器是th主要的一個。它聲明對project-api-autoconfigure的依賴關係,同時它排除project-api-autoconfigure對項目模塊-pi-api模塊的傳遞依賴關係。
內項目server.gradle:
dependencies {
compile (project(':project-api-autoconfigure')) {
exclude module: 'project-module-a-api'
exclude module: 'project-module-b-api'
...
}
...
}
項目-API自動配置取決於所有API模塊,因此依賴將是這樣的項目-API autoconfigure.gradle:
dependencies {
compile project(':project-module-a-api')
compile project(':project-module-b-api')
...
}
項目-API自動配置是我創建d ispatcher servlet bean爲每個API模塊提供自己的Web應用程序上下文,但是此配置取決於每個API模塊JAR中的每個API模塊的配置類。
我創建和抽象類從每一個自動配置類繼承:
public abstract class AbstractApiModuleAutoConfiguration<T> {
@Autowired
protected ApplicationContext applicationContext;
@Autowired
protected ServerProperties server;
@Autowired(required = false)
protected MultipartConfigElement multipartConfig;
@Value("${project.rest.base-api-path}")
protected String baseApiPath;
protected DispatcherServlet createApiModuleDispatcherServlet() {
AnnotationConfigWebApplicationContext webContext = new AnnotationConfigWebApplicationContext();
webContext.setParent(applicationContext);
webContext.register(getApiModuleConfigurationClass());
return new DispatcherServlet(webContext);
}
protected ServletRegistrationBean createApiModuleDispatcherServletRegistration(DispatcherServlet apiModuleDispatcherServlet) {
ServletRegistrationBean registration = new ServletRegistrationBean(
apiModuleDispatcherServlet,
this.server.getServletMapping() + baseApiPath + "/" + getApiModulePath() + "/*");
registration.setName(getApiModuleDispatcherServletBeanName());
if (this.multipartConfig != null) {
registration.setMultipartConfig(this.multipartConfig);
}
return registration;
}
protected abstract String getApiModuleDispatcherServletBeanName();
protected abstract String getApiModulePath();
protected abstract Class<T> getApiModuleConfigurationClass();
}
所以,現在,對於模塊A自動配置類將是這個樣子:
@Configuration
@ConditionalOnClass(ApiModuleAConfiguration.class)
@ConditionalOnProperty(prefix = "project.moduleA.", value = "enabled")
public class ApiModuleAAutoConfiguration extends AbstractApiModuleAutoConfiguration<ApiModuleAConfiguration> {
public static final String API_MODULE_A_DISPATCHER_SERVLET_BEAN_NAME = "apiModuleADispatcherServlet";
public static final String API_MODULE_A_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME = "apiModuleADispatcherServletRegistration";
@Value("${project.moduleA.path}")
private String apiModuleAPath;
@Bean(name = API_MODULE_A_DISPATCHER_SERVLET_BEAN_NAME)
public DispatcherServlet apiModuleADispatcherServlet() {
return createApiModuleDispatcherServlet();
}
@Bean(name = API_MODULE_A_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME)
public ServletRegistrationBean apiModuleADispatcherServletRegistration() {
return createApiModuleDispatcherServletRegistration(apiModuleADispatcherServlet());
}
@Override
protected String getApiModuleDispatcherServletBeanName() {
return API_MODULE_A_DISPATCHER_SERVLET_BEAN_NAME;
}
@Override
protected String getApiModulePath() {
return apiModuleAPath;
}
@Override
protected Class<ApiModuleAConfiguration> getApiModuleConfigurationClass() {
return ApiModuleAConfiguration.class;
}
}
而現在,你ApiModuleAConfiguration,ApiModuleBConfiguration ...配置類將在每個API模塊上project-module-a-api,project-module-b-api ...
它們可以是RepositoryRestMvcConfiguration或者它們可以從它擴展或者它們可以是導入Spring Data REST配置的任何其他配置類。
最後但並非最不重要,我在主模塊項目服務器內創建了不同的gradle腳本,以便根據傳遞給gradle的屬性加載以模擬Maven配置文件。每個腳本聲明爲需要包含的api模塊的依賴關係。它看起來是這樣的:
- project-server
/profiles/
profile-X.gradle
profile-Y.gradle
profile-Z.gradle
和例如,輪廓-X使API模塊A和B:
dependencies {
compile project(':project-module-a-api')
compile project(':project-module-b-api')
}
processResources {
from 'src/main/resources/profiles/profile-X'
include 'profile-x.properties'
into 'build/resources/main'
}
其他配置文件可以使不同的API模塊。
配置文件是從項目server.gradle加載這樣:
loadProfile()
processResources {
include '**/*'
exclude 'profiles'
}
dependencies {
compile (project(':project-api-autoconfigure')) {
exclude module: 'project-module-a-api'
exclude module: 'project-module-b-api'
...
}
...
}
...
def loadProfile() {
def profile = hasProperty('profile') ? "${profile}" : "dev"
println "Profile: " + profile
apply from: "profiles/" + profile + ".gradle"
}
而這一切,或多或少。我希望它可以幫助你1月
乾杯。
由於您正在使用spring引導,爲什麼不在每個tomcat和上下文(完全獨立)中部署每個spring data rest應用程序?也許你需要設置一個CORS來防止跨域。我無法看到這種方法的任何問題。 – 2014-12-07 01:29:54
我會對此感興趣。如果你找到了解決方案,請分享 – 2015-02-12 09:40:11