我有使用JPA的应用程序。
由于超出此问题的原因,我在单独的静态配置类中提供自定义JPAVendorAdapter
。并且配置行为不确定。
当我启用--debug
时,在我的Windows deksktop上,我看到了预期的结果:
JpaBaseConfiguration#jpaVendorAdapter - @ConditionalOnMissingBean(types:org.springframework.orm.jpa.JpaVendorAdapter; SearchStrategy:all) 发现以下[customJPAVendorAdapter](OnBeanCondition)
但是,只要我将应用程序部署到某个服务器,我就会得到:
JpaBaseConfiguration#jpaVendorAdapter - @ConditionalOnMissingBean(types:org.springframework.orm.jpa.JpaVendorAdapter; SearchStrategy:all) 找不到豆子(OnBeanCondition)
代码绝对一样。
请问有什么方法可以告诉我@Bean
JPAVendorAdapter
必须在JpaBaseConfiguration
启动之前创建并自动配置默认适配器吗?
修改
配置相当普遍,但希望我将涵盖主要部分:
主要配置:
@ComponentScan(
value = {"module.package"}
)
@EnableAutoConfiguration(exclude = {
SecurityAutoConfiguration.
DataSourceAutoConfiguration.class,
HibernateJpaAutoConfiguration.class,
JpaBaseConfiguration.class
})
@EnableScheduling
@EnableConfigurationProperties
@Configuration
@Slf4j
public class MainConfig extends SpringBootServletInitializer implements SchedulingConfigurer {
...
}
使用JPA的模块:
@Configuration
@Slf4j
@Conditional(value = SelfHelpConfig.ModuleCondition.class)
@ComponentScan(basePackageClasses = SelfHelpModuleComponentScanPlaceholder.class)
public class SelfHelpConfig {
public static class ModuleCondition extends AbstractModuleEnabledCondition {
@Override
public String getModuleId() {
return "self-help";
}
}
@Configuration
@Conditional(value = SelfHelpConfig.ModuleCondition.class)
static class JpaVendorConfig {
@Bean
public AbstractJpaVendorAdapter customJPAVendorAdapter(SpringHibernateJpaPersistenceProviderWithNamingStrategy jpaPersistenceProvider) {
log.info("Creating custom JPA vendor adapter");
return new HibernateJpaVendorAdapter() {
@Override
public PersistenceProvider getPersistenceProvider() {
return jpaPersistenceProvider;
}
};
}
}
}
此模块@ComponentScan
发现数据库配置:
@Configuration
@EntityScan(basePackageClasses = SelfHelpModuleComponentScanPlaceholder.class)
@EnableJpaRepositories(basePackageClasses = SelfHelpModuleComponentScanPlaceholder.class)
@Import({DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
public class DBConfig {
}
如果JPAVendorConfig没有放在单独的类中,则根本不应用它。如果在单独的类中,则它可以在我的桌面上运行,但在部署到Linux服务器时则不行。