При выполнении аннотированного метода @Bean переменная Autowired Environment имеет значение NULL. - PullRequest
0 голосов
/ 06 октября 2019

Я пытаюсь получить свойства, загруженные из файла .yml, автоматически подключая переменную окружения, но я получаю исключение нулевого указателя:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [com/example/AppConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.sql.DataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.NullPointerException

Я хочу программно создать бин DataSource, покахранение данных (имя пользователя, пароль, хост и т. д.) в файле конфигурации. Это мои настройки на данный момент:

@SpringBootApplication
@ImportResource({"classpath:controllers.xml"})
public class WebApplication{
  public static void main(String[] args){
    SpringApplication.run(WebApplication.class, args);
  }
}
server:
  port: 8080

database:
  host: localhost
  instance: db_instance
  port: 3036
  user: root
  password: passkey
@Configuration
public class AppConfig {
  @Autowired
  private Environment environment;

  @Bean
  public DataSource dataSource() {
    String url = "jdbc:mysql://" +
        environment.getProperty("database.host") +
        ":" + environment.getProperty("database.port") +
        "/" + environment.getProperty("database.instance") +
        "?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true";

    return DataSourceBuilder.create()
        .driverClassName("com.mysql.jdbc.Driver")
        .url(url)
        .username(environment.getProperty("database.user"))
        .password(environment.getProperty("database.password"))
        .build();
  }
}

Я не неравнодушен ни к формату файла .yml, ни к использованию переменной Environment. Если есть другой / лучший способ получения данных из файла .yml (или другого формата), я готов попробовать.

Ответы [ 2 ]

2 голосов
/ 06 октября 2019

Есть много способов сделать это.

  1. Поскольку вы используете Springboot, вам не нужно явно создавать источник данных, подобный этому (в этом случае вы упускаете одну из основных функций Springboot). Если вы объявите параметры в свойствах / yml с правильными ключами, Springboot с Autoconfigure это для вас.
    Поиск spring.datasource...... здесь

  2. Если вы хотитечтобы сделать это самостоятельно, вы можете автоматически связать все переменные в файле properties / yml в компонент с помощью ConfigurationProperties, а затем использовать этот компонент в качестве параметра метода в методе создания компонента.
    check this out

  3. Используйте @Value{} в своем классе AppConfig и используйте его в своем методе создания источника данных.
0 голосов
/ 08 октября 2019

Не совсем уверен, что там в controllers.xml. Но я смог получить переменную окружения и использовать ее.

Я поместил свойства, которые вы упоминали в application.yml, в / src / main / resources

Я использовал версию Spring boot-2.1.9чтобы он работал и ниже мой pom.xml-

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.sample</groupId>
    <artifactId>stackoverflow</artifactId>
    <version>0.0.1</version>
    <packaging>jar</packaging>

    <name>stackoverflow</name>
    <description>stackoverflow</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.9.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-jpa -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>

        </dependency>



        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>spring-snapshots</id>
            <name>Spring Snapshots</name>
            <url>https://repo.spring.io/libs-snapshot-local</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
        <repository>
            <id>ojo-snapshots</id>
            <name>OJO Snapshots</name>
            <url>https://oss.jfrog.org/artifactory/libs-snapshot</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>


</project>


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...