当前位置: 首页 > 知识库问答 >
问题:

当执行@Bean注释的方法时,Autowired环境变量为NULL

王曜文
2023-03-14

我正在尝试检索从中加载的属性。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

我想通过编程创建一个数据源bean,同时将详细信息(用户名、密码、主机等)保存在配置文件中。这是我目前的设置:

@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文件格式或使用环境变量。如果有不同/更好的方法从. yml文件(或其他一些文件格式)中获取数据,我愿意尝试一下。

共有2个答案

陆高峰
2023-03-14

不太确定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>


白祺然
2023-03-14

有很多方法可以做到这一点。

>

  • 因为您使用的是Springboot,所以您不必像这样显式地创建数据源(如果您这样做,您就错过了springboot的主要功能之一)。如果您使用右键在属性/yml中声明参数,Springboot会自动配置它。
    在此处搜索spring.datasource.......

    如果您希望自己完成这项工作,那么可以使用ConfigurationProperties将properties/yml文件中的所有变量自动关联到一个Bean中,然后在Bean创建方法中将此Bean用作方法参数<看看这个

  •  类似资料:
    • 我知道从中调用带注释的方法,前面已经讨论过了。 但是我不明白为什么当bean被覆盖时它就不起作用了。 我有一个遗留类,我不能修改。它是一个配置,同时也是一个业务bean。这是一个简化版本: 现在,调用返回而不是。 当配置被删除并且测试上下文的配置被设置为时,一切都能正常工作(结果为)。 在测试中注册bean有什么不同?

    • 问题内容: 我的测试课: 我在行上得到一个空指针异常: 在精确的给出空指针异常 如何使Junit类中的beanObject字段自动装配成为可能,以便可以使用“ BeanClass”类中的方法? 从评论中复制: 用简单的术语来说.. beanClass是具有某些方法的接口..我用 注释标记了该beanClass。.banClass 是由具有方法实现的beanClassImpl类实现的。.我需要在我的

    • 问题内容: 在詹金斯(Jenkins)的工作中,我正在执行预构建中的一些操作,例如执行Shell脚本。通过使用Jenkins插件“ EnvInject”,我想将环境变量注入到我的Maven构建(单元测试)中,以便可以在Java单元测试中使用这些变量。在shell脚本中,即时消息执行类似以下操作: 在构建Jenkins时,输出以下内容: 但是“ ip”变量在我的Java代码(单元测试)中不可用。当我

    • 在Jenkins的工作中,我正在执行驻留在预步骤构建中的几个操作,例如执行外壳脚本。使用Jenkins插件EnvInject,我想将环境变量注入到我的maven构建(单元测试)中,以便在我的Java单元测试中使用。在外壳脚本IM做类似的事情: 在构建Jenkins时,输出以下内容: 但是“ip”变量在我的Java代码(单元测试)中不可用。当我完整打印两个我没有看到登记的“ip”。 我是否需要为ma

    • 把task的执行结果当作是一个变量的值也是可以的。这个时候就需要用到“注册变量”,将执行结果注册到一个变量中,待后面的action使用: --- - hosts: web tasks: - shell: ls register: result ignore_errors: True - shell: echo "{{ result.stdout

    • 问题内容: 我试图获取通过终端机(Mac)设置的环境变量的值,同时还在.bash_profile文件中设置该变量并重新加载。这样做之后,我回显了该值,并在终端上打印了正确的值。尝试检索变量的值时(我确保在.bash_profile文件中以及在使用时都使用了正确的名称。 在下面的代码中,我用 VAR_NAME 替换了变量的名称: 在我的.bash_profile中: 当我打印出的值时,将打印“ nu