数据源无法实例化

huangapple go评论108阅读模式
英文:

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(&quot;${ansir.datasource}&quot;)
private String SCHEMA_NAME;
@Value(&quot;${ansir.datasource.jdbc-url}&quot;)
private String jdbcUrl;
@Value(&quot;${ansir.datasource.username}&quot;)
private String username;
@Value(&quot;${ansir.datasource.password}&quot;)
private String password;
@Value(&quot;${ansir.datasource.driver-class-name}&quot;)
private String driverClassName;
@Value(&quot;${ansir.datasource.hikari.maximum-pool-size}&quot;)
private String maxPool;
@Value(&quot;${ansir.datasource.hikari.pool-name}&quot;)
private String poolName;
@Value(&quot;${ansir.datasource.jpa.show-sql}&quot;)
private String showSql;
@Value(&quot;${ansir.datasource.jpa.hibernate.dialect}&quot;)
private String hibernateDialect;
@Value(&quot;${ansir.datasource.jpa.hibernate.ddl-auto}&quot;)
private String ddl;
private final Environment env;
@Autowired
public ANSIRConfiguration(Environment env) {
this.env = env;
}
@Bean
@ConfigurationProperties(&quot;ansir.datasource&quot;)
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(&quot;ansirEntityManager&quot;) LocalContainerEntityManagerFactoryBean entityManagerFactoryBean) {
JpaTransactionManager transactionManager
= new JpaTransactionManager();
transactionManager.setEntityManagerFactory(
entityManagerFactoryBean.getObject());
return transactionManager;
}
@Bean(&quot;ansirEntityManager&quot;)
public LocalContainerEntityManagerFactoryBean ansirEntityManager(@Qualifier(&quot;ansirDataSource&quot;)DataSource ansirDataSource) {
LocalContainerEntityManagerFactoryBean entityManagerFactory
= new LocalContainerEntityManagerFactoryBean();
entityManagerFactory.setDataSource(ansirDataSource);
entityManagerFactory.setPackagesToScan(&quot;com.autonation.ca.client.ansir.entity&quot;);
entityManagerFactory.setPersistenceUnitName(&quot;ansir&quot;);
HibernateJpaVendorAdapter vendorAdapter
= new HibernateJpaVendorAdapter();
entityManagerFactory.setJpaVendorAdapter(vendorAdapter);
HashMap&lt;String, Object&gt; properties = new HashMap&lt;&gt;();
properties.put(&quot;hibernate.hbm2ddl.auto&quot;,
env.getProperty(ddl));
properties.put(&quot;hibernate.dialect&quot;,
env.getProperty(hibernateDialect));
properties.put(&quot;hibernate.proc.param_null_passing&quot;, true);
properties.put(&quot;hibernate.show_sq&quot;, 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.

huangapple
  • 本文由 发表于 2023年2月18日 21:40:55
  • 转载请务必保留本文链接:https://go.coder-hub.com/75493724.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定