Источник данных не может создать экземпляр

Я пытаюсь подключиться к внешней базе данных 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)

Спасибо.

удалить @Autowired из конструктора и снова протестировать? log on std показывает, что конструктор создан неправильно.

Amir Rad 18.02.2023 17:02

@AmirRad Я пробовал, но это не сработало.

clement mensah 18.02.2023 18:19

Не ответ, просто наблюдение: ваш URL-адрес JDBC выглядит подозрительно: jdbc-url: jdbc:sqlserver://SERVER:;databaseName=DB;encrypt=false. Это :; предполагает, что вам не хватает номера порта. За двоеточием (:) должен следовать номер порта, или его следует удалить из строки URL. Вы можете проверить свою строку URL отдельно, чтобы убедиться, что она действительна.

andrewJames 18.02.2023 18:30

Я повторяю то, что написал @Oliver, когда они упомянули (а) вам следует попытаться улучшить форматирование вашего вопроса; и (b) вы должны предоставить MRE - удалите каждую строку кода, которая не имеет отношения к вашей проблеме. Вы пока не сделали ни того, ни другого.

andrewJames 18.02.2023 18:36

@andrewJames Я отредактировал сейчас. Что касается URL-адреса, у него есть порт номер порта

clement mensah 18.02.2023 19:34

Хорошо, я не это имел в виду, но в любом случае спасибо за правки.

andrewJames 18.02.2023 19:42
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
6
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

измените файл 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, который не может быть найден».

clement mensah 18.02.2023 20:26

Используйте @EnableJpaRepositories(basePackages = "your.package", entityManagerFactoryRef = "emf") для связанного пакета.

Amir Rad 18.02.2023 21:52

Спасибо @Амир Рад. Я использовал EnableJpaRepositories, и это сработало.

clement mensah 20.02.2023 18:28

Другие вопросы по теме