我正在学习有关 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
文件的状态时,一切都会按预期工作。
我重新采取了尽可能隔离问题的步骤。
我所做的只是:
application.properties
application.yml
我没有更改任何其他内容。
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 在创建时暂存了新文件。只是为了消除任何混乱。虽然这不应该影响结果。
按照评论中的建议,我尝试添加
@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")}
当您使用 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
注释,另请参阅下面的我的评论)。
我也有过这样的经历。只需执行
mvn clean install
或 mvn clean test
即可解决。这应该以某种方式重置您的项目以查看正确的应用程序属性文件