Java Spring Boot 自定义属性在 application.yml 中不起作用

问题描述 投票:0回答:2

我正在学习有关 Java Spring Boot 的教程,当前主题是可以同时使用

application.properties
application.yml

所以我的

application.properties
看起来像这样:

spring.profiles.active=EN, cat
custom.username=user
custom.password=pass

我删除了它并创建了一个

application.yml
。 IntelliJ 甚至用绿色的小启动按钮图标来标记它。
application.yml
看起来像这样:

spring:
  profiles:
    active: EN, cat
custom:
  username: user
  password: pass

但是当我执行

custom
属性时,它不再被识别。 IDE 将它们标记为红色并显示此错误:“此处不需要密钥‘自定义’”

我不确定这是否正确,所以我尝试了 IDE 在使用自动完成功能来编写

spring.profiles.active
时所建议的内容,它正在编写这样的列表元素:

spring:
  profiles:
    active:
      - EN
      - cat
custom:
  username: user
  password: pass

但这也没有帮助。

我不知道从这里该去哪里。我试图研究这个问题,但是我得到的唯一的结果有点接近,都只是提到可以使用

yml
而不是
properties
,有些甚至使用我上面显示的自定义属性。

这可能是版本问题吗?我的 pom 看起来像这样:

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>myID</groupId>
    <artifactId>myArtifact</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>myName</name>
    <description>myDescription</description>
    <properties>
        <java.version>11</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-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

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

</project>

更新

回答Mark B在评论中提出的问题。这是错误消息:


Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
2023-01-05T08:58:07.711+01:00 ERROR 5026 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   : 

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of constructor in my.package.controllers.I18nController required a bean of type 'my.package.services.GreetingService' that could not be found.

The injection point has the following annotations:
    - @org.springframework.beans.factory.annotation.Qualifier("i18nService")

The following candidates were found but could not be injected:
    - User-defined bean
    - User-defined bean
    - User-defined bean method 'primaryGreetingService' in 'GreetingServiceConfig'
    - User-defined bean method 'propertyInjectedGreetingService' in 'GreetingServiceConfig'
    - User-defined bean method 'setterInjectedGreetingService' in 'GreetingServiceConfig'
    - User-defined bean


Action:

Consider revisiting the entries above or defining a bean of type 'my.package.services.GreetingService' in your configuration.


Process finished with exit code 1

乍一看,这看起来可能是我搞乱了 bean 的定义或配置中的某些内容。但是,当我将存储库恢复到如上所述使用

application.properties
文件的状态时,一切都会按预期工作。

我重新采取了尽可能隔离问题的步骤。

我所做的只是:

  1. 删除
    application.properties
  2. 创建
    application.yml

我没有更改任何其他内容。

git status(翻译和简化):

On Branch master
Your Branch is in the same state as 'origin/master'.

Staged changes:
        deleted:       src/main/resources/application.properties
        new file:     src/main/resources/application.yml

Unstaged changes::
        changed:       src/main/resources/application.yml

src/main/resources/application.yml
作为新文件暂存,然后具有未暂存的更改,因为 IDE 在创建时暂存了新文件。只是为了消除任何混乱。虽然这不应该影响结果。

更新2

按照评论中的建议,我尝试添加

@ConfigurationProperties(prefix = "custom")
,但所做的只是稍微改变了错误:

Error creating bean with name 'i18nController' defined in file
[/path/target/classes/my/package/controllers/I18nController.class]:
Unsatisfied dependency expressed through constructor parameter 0:
No qualifying bean of type 'my.package.services.GreetingService' available:
expected at least 1 bean which qualifies as autowire candidate.
Dependency annotations:
{@org.springframework.beans.factory.annotation.Qualifier("i18nService")}
java spring-boot properties-file
2个回答
0
投票

当您使用 spring-boot-starter SnakeYAML 库时,应该位于您的类路径上,但请使用

mvn dependency:list
仔细检查,在输出中搜索一行
[INFO]    org.yaml:snakeyaml:jar:1.33:compile -- module org.yaml.snakeyaml [auto]
.

如果缺少,请添加 SnakeYAML 依赖项:https://mvnrepository.com/artifact/org.yaml/snakeyaml

Eclipse IDE 具有自动转换机制,可将属性转换为 yaml 格式。只需右键单击该文件,然后单击“转换”,它就像一个魅力。我正在使用 Eclipse STS 版本。

我猜您没有共享完整的属性文件,并且 yaml 配置中存在语法错误或缺少某些内容。请尝试使用适用于 InteliJ IDEA 的插件:https://plugins.jetbrains.com/plugin/8000-properties-to-yaml-converter 或在线转换器,例如:https://www.javainuse。 com/app2yaml .


更新:

我决定使用完全相同版本的 SpringBoot 和 Java 在我的机器上重现您的示例代码。首先,我创建了一个属性文件并进行了测试(它工作得很好),然后将属性文件迁移到 YAML 格式,它也工作得很好,结果完全相同。

当涉及到意外的键

custom
时,它仅表示该键未知(更像是警告然后是错误),您可以在
META-INF
中定义它,如下所示。

因此,正如其他评论所暗示的那样,我确信它已连接到以某种硬编码方式中继属性文件的代码(例如

@PropertySource
注释,另请参阅下面的我的评论)。


0
投票

我也有过这样的经历。只需执行

mvn clean install
mvn clean test
即可解决。这应该以某种方式重置您的项目以查看正确的应用程序属性文件

© www.soinside.com 2019 - 2024. All rights reserved.