Я пытаюсь подключиться к внешней базе данных mssql, но получаю исключение при создании экземпляра компонента. Я попытался аннотировать свой основной класс с помощью @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;
}
}
моя трассировка стека:
Вызвано: java.lang.NullPointerException: null в java.base/java.util.concurrent.ConcurrentHashMap.putVal(ConcurrentHashMap.java:1011) в java.base/java.util.concurrent.ConcurrentHashMap.putIfAbsent(ConcurrentHashMap.java:1541) в java.base/java.lang.ClassLoader.getClassLoadingLock(ClassLoader.java:667) в java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:591) в java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:579) в java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) в java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) в com.zaxxer.hikari.HikariConfig.attemptFromContextLoader(HikariConfig.java:970) на com.zaxxer.hikari.HikariConfig.setDriverClassName(HikariConfig.java:480) в org.springframework.boot.jdbc.DataSourceBuilder$MappedDataSourceProperty.set(DataSourceBuilder.java:460) в org.springframework.boot.jdbc.DataSourceBuilder$MappedDataSourceProperties.set(DataSourceBuilder.java:355) в org.springframework.boot.jdbc.DataSourceBuilder.build(DataSourceBuilder.java:190) в com.autonation.ca.client.ansir.config.ANSIRConfiguration.ansirDataSource(ANSIRConfiguration.java:64) в com.autonation.ca.client.ansir.config.ANSIRConfiguration$$EnhancerBySpringCGLIB$$307494cc.CGLIB$ansirDataSource$2() в com.autonation.ca.client.ansir.config.ANSIRConfiguration$$EnhancerBySpringCGLIB$$307494cc$$FastClassBySpringCGLIB$$d0e3b4d8.invoke() в org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244) в org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:331) в com.autonation.ca.client.ansir.config.ANSIRConfiguration$$EnhancerBySpringCGLIB$$307494cc.ansirDataSource() в java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) в java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) в java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) в java.base/java.lang.reflect.Method.invoke(Method.java:566) в org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)
Спасибо.
@AmirRad Я пробовал, но это не сработало.
Не ответ, просто наблюдение: ваш URL-адрес JDBC выглядит подозрительно: jdbc-url: jdbc:sqlserver://SERVER:;databaseName=DB;encrypt=false
. Это :;
предполагает, что вам не хватает номера порта. За двоеточием (:
) должен следовать номер порта, или его следует удалить из строки URL. Вы можете проверить свою строку URL отдельно, чтобы убедиться, что она действительна.
Я повторяю то, что написал @Oliver, когда они упомянули (а) вам следует попытаться улучшить форматирование вашего вопроса; и (b) вы должны предоставить MRE - удалите каждую строку кода, которая не имеет отношения к вашей проблеме. Вы пока не сделали ни того, ни другого.
@andrewJames Я отредактировал сейчас. Что касается URL-адреса, у него есть порт номер порта
Хорошо, я не это имел в виду, но в любом случае спасибо за правки.
измените файл 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.
Я получаю эту ошибку, когда использую файл .properties: «Параметр 1 конструктора в com.autonation.ca.service.AppointmentService требует bean-компонента с именем EntityManagerFactory, который не может быть найден».
Используйте @EnableJpaRepositories(basePackages = "your.package", entityManagerFactoryRef = "emf") для связанного пакета.
Спасибо @Амир Рад. Я использовал EnableJpaRepositories, и это сработало.
удалить @Autowired из конструктора и снова протестировать? log on std показывает, что конструктор создан неправильно.