英文:
DataSource failing to instantiate
问题
我正在尝试连接到外部的mssql数据库,但是我遇到了一个bean实例化异常。我尝试在我的主类上使用 @EnableJpaRepo 进行注解,排除 DataSourceAutoConfiguration 等。我尝试使用 MyBatis,它可以工作,但我被指示使用 Jpa。谢谢。
我的 .yml 文件:
ansir.datasource:
schema: schema
jdbc-url: jdbc:sqlserver://SERVER:PORTNO;databaseName=DB;encrypt=false
username: root
password: pwd
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
hikari.maximum-pool-size: 10
hikari.pool-name: HikariPool-ANSIR
jpa:
show-sql: true
hibernate.dialect: org.hibernate.dialect.SQLServer2012Dialect
hibernate.ddl-auto: none
我的配置类:
@Value("${ansir.datasource}")
private String SCHEMA_NAME;
@Value("${ansir.datasource.jdbc-url}")
private String jdbcUrl;
@Value("${ansir.datasource.username}")
private String username;
@Value("${ansir.datasource.password}")
private String password;
@Value("${ansir.datasource.driver-class-name}")
private String driverClassName;
@Value("${ansir.datasource.hikari.maximum-pool-size}")
private String maxPool;
@Value("${ansir.datasource.hikari.pool-name}")
private String poolName;
@Value("${ansir.datasource.jpa.show-sql}")
private String showSql;
@Value("${ansir.datasource.jpa.hibernate.dialect}")
private String hibernateDialect;
@Value("${ansir.datasource.jpa.hibernate.ddl-auto}")
private String ddl;
private final Environment env;
@Autowired
public ANSIRConfiguration(Environment env) {
this.env = env;
}
@Bean
@ConfigurationProperties("ansir.datasource")
public DataSource ansirDataSource() {
return DataSourceBuilder.create()
.driverClassName(env.getProperty(driverClassName))
.url(env.getProperty(jdbcUrl))
.username(env.getProperty(username))
.password(env.getProperty(password))
.build();
}
@Bean
public PlatformTransactionManager ansirTransactionManager(@Qualifier("ansirEntityManager") LocalContainerEntityManagerFactoryBean entityManagerFactoryBean) {
JpaTransactionManager transactionManager
= new JpaTransactionManager();
transactionManager.setEntityManagerFactory(
entityManagerFactoryBean.getObject());
return transactionManager;
}
@Bean("ansirEntityManager")
public LocalContainerEntityManagerFactoryBean ansirEntityManager(@Qualifier("ansirDataSource") DataSource ansirDataSource) {
LocalContainerEntityManagerFactoryBean entityManagerFactory
= new LocalContainerEntityManagerFactoryBean();
entityManagerFactory.setDataSource(ansirDataSource);
entityManagerFactory.setPackagesToScan("com.autonation.ca.client.ansir.entity");
entityManagerFactory.setPersistenceUnitName("ansir");
HibernateJpaVendorAdapter vendorAdapter
= new HibernateJpaVendorAdapter();
entityManagerFactory.setJpaVendorAdapter(vendorAdapter);
HashMap<String, Object> properties = new HashMap<>();
properties.put("hibernate.hbm2ddl.auto",
env.getProperty(ddl));
properties.put("hibernate.dialect",
env.getProperty(hibernateDialect));
properties.put("hibernate.proc.param_null_passing", true);
properties.put("hibernate.show_sq", showSql);
entityManagerFactory.setJpaPropertyMap(properties);
return entityManagerFactory;
}
我的堆栈跟踪:
Caused by: java.lang.NullPointerException: null
at java.base/java.util.concurrent.ConcurrentHashMap.putVal(ConcurrentHashMap.java:1011)
at java.base/java.util.concurrent.ConcurrentHashMap.putIfAbsent(ConcurrentHashMap.java:1541)
at java.base/java.lang.ClassLoader.getClassLoadingLock(ClassLoader.java:667)
...
谢谢。
英文:
I am trying to connect to an external mssql database but I am getting a bean instantiation exception. I have tried annotating my main class with @EnableJpaRepo, excluding DataSourceAutoConfiguration etc. I tried using myBatis and it worked but I've been instructed to use Jpa. Thank you.
My .yml file:
ansir.datasource:
schema: schema
jdbc-url: jdbc:sqlserver://SERVER:PORTNO;databaseName=DB;encrypt=false
username: root
password: pwd
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
hikari.maximum-pool-size: 10
hikari.pool-name: HikariPool-ANSIR
jpa:
show-sql: true
hibernate.dialect: org.hibernate.dialect.SQLServer2012Dialect
hibernate.ddl-auto: none
my config class:
@Value("${ansir.datasource}")
private String SCHEMA_NAME;
@Value("${ansir.datasource.jdbc-url}")
private String jdbcUrl;
@Value("${ansir.datasource.username}")
private String username;
@Value("${ansir.datasource.password}")
private String password;
@Value("${ansir.datasource.driver-class-name}")
private String driverClassName;
@Value("${ansir.datasource.hikari.maximum-pool-size}")
private String maxPool;
@Value("${ansir.datasource.hikari.pool-name}")
private String poolName;
@Value("${ansir.datasource.jpa.show-sql}")
private String showSql;
@Value("${ansir.datasource.jpa.hibernate.dialect}")
private String hibernateDialect;
@Value("${ansir.datasource.jpa.hibernate.ddl-auto}")
private String ddl;
private final Environment env;
@Autowired
public ANSIRConfiguration(Environment env) {
this.env = env;
}
@Bean
@ConfigurationProperties("ansir.datasource")
public DataSource ansirDataSource() {
return DataSourceBuilder.create()
.driverClassName(env.getProperty(driverClassName))
.url(env.getProperty(jdbcUrl))
.username(env.getProperty(username))
.password(env.getProperty(password))
.build();
}
@Bean
public PlatformTransactionManager ansirTransactionManager(@Qualifier("ansirEntityManager") LocalContainerEntityManagerFactoryBean entityManagerFactoryBean) {
JpaTransactionManager transactionManager
= new JpaTransactionManager();
transactionManager.setEntityManagerFactory(
entityManagerFactoryBean.getObject());
return transactionManager;
}
@Bean("ansirEntityManager")
public LocalContainerEntityManagerFactoryBean ansirEntityManager(@Qualifier("ansirDataSource")DataSource ansirDataSource) {
LocalContainerEntityManagerFactoryBean entityManagerFactory
= new LocalContainerEntityManagerFactoryBean();
entityManagerFactory.setDataSource(ansirDataSource);
entityManagerFactory.setPackagesToScan("com.autonation.ca.client.ansir.entity");
entityManagerFactory.setPersistenceUnitName("ansir");
HibernateJpaVendorAdapter vendorAdapter
= new HibernateJpaVendorAdapter();
entityManagerFactory.setJpaVendorAdapter(vendorAdapter);
HashMap<String, Object> properties = new HashMap<>();
properties.put("hibernate.hbm2ddl.auto",
env.getProperty(ddl));
properties.put("hibernate.dialect",
env.getProperty(hibernateDialect));
properties.put("hibernate.proc.param_null_passing", true);
properties.put("hibernate.show_sq", showSql);
entityManagerFactory.setJpaPropertyMap(properties);
return entityManagerFactory;
}
}
my stack trace:
Caused by: java.lang.NullPointerException: null
at java.base/java.util.concurrent.ConcurrentHashMap.putVal(ConcurrentHashMap.java:1011)
at java.base/java.util.concurrent.ConcurrentHashMap.putIfAbsent(ConcurrentHashMap.java:1541)
at java.base/java.lang.ClassLoader.getClassLoadingLock(ClassLoader.java:667)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:591)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:579)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
at com.zaxxer.hikari.HikariConfig.attemptFromContextLoader(HikariConfig.java:970)
at com.zaxxer.hikari.HikariConfig.setDriverClassName(HikariConfig.java:480)
at org.springframework.boot.jdbc.DataSourceBuilder$MappedDataSourceProperty.set(DataSourceBuilder.java:460)
at org.springframework.boot.jdbc.DataSourceBuilder$MappedDataSourceProperties.set(DataSourceBuilder.java:355)
at org.springframework.boot.jdbc.DataSourceBuilder.build(DataSourceBuilder.java:190)
at com.autonation.ca.client.ansir.config.ANSIRConfiguration.ansirDataSource(ANSIRConfiguration.java:64)
at com.autonation.ca.client.ansir.config.ANSIRConfiguration$$EnhancerBySpringCGLIB$$307494cc.CGLIB$ansirDataSource$2(<generated>)
at com.autonation.ca.client.ansir.config.ANSIRConfiguration$$EnhancerBySpringCGLIB$$307494cc$$FastClassBySpringCGLIB$$d0e3b4d8.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244)
at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:331)
at com.autonation.ca.client.ansir.config.ANSIRConfiguration$$EnhancerBySpringCGLIB$$307494cc.ansirDataSource(<generated>)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)
Thank you.
答案1
得分: 0
将application.yml
文件更改为application.properties
,并使用以下配置:
ansir.datasource.schema= schema
ansir.datasource.jdbc-url=jdbc:sqlserver://SERVER;databaseName=DB;encrypt=false
ansir.datasource.username=root
ansir.datasource.password=pwd
ansir.datasource.driver-class-name= com.microsoft.sqlserver.jdbc.SQLServerDriver
ansir.datasource.hikari.maximum-pool-size=10
ansir.datasource.hikari.pool-name= HikariPool-ANSIR
ansir.datasource.jpa.show-sql= true
ansir.datasource.jpa.hibernate.dialect= org.hibernate.dialect.SQLServer2012Dialect
ansir.datasource.jpa.hibernate.ddl-auto= none
在application.yml
文件中,不应该正常使用句号(period)。
英文:
change application.yml file to application.properties with these config,
ansir.datasource.schema= schema
ansir.datasource.jdbc-url=jdbc:sqlserver://SERVER;databaseName=DB;encrypt=false
ansir.datasource.username=root
ansir.datasource.password=pwd
ansir.datasource.driver-class-name= com.microsoft.sqlserver.jdbc.SQLServerDriver
ansir.datasource.hikari.maximum-pool-size=10
ansir.datasource.hikari.pool-name= HikariPool-ANSIR
ansir.datasource.jpa.show-sql= true
ansir.datasource.jpa.hibernate.dialect= org.hibernate.dialect.SQLServer2012Dialect
ansir.datasource.jpa.hibernate.ddl-auto= none
period is not normal use in application.yml file.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论