我正在嘗試使用 @ConfigurationProperties 注釋將物件串列系結到我的物體類。Spring Boot 框架似乎忽略了該注釋,它實際上什么也沒做。
這是我的 application.yml 屬性檔案:
spring:
datasource:
url: jdbc:mysql://localhost:3306/search-engine
username: landsreyk
password: 12345678
jpa:
database-platform: org.hibernate.dialect.MySQLDialect
show-sql: false
hibernate:
ddl-auto: none
sites:
- url: http://someurl1.com
name: somename1
- url: https://someurl2.com
name: somename2
- url: https://someurl3.com
name: somename3
這是我的物體類:
package main.model;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import javax.persistence.*;
import java.sql.Timestamp;
@Getter
@Setter
@ToString
@Entity
@Table(name = "_site")
public class Site {
@Column(nullable = false)
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Enumerated(EnumType.STRING)
@Column(name = "status")
private Status status;
@Column(name = "status_time")
private Timestamp statusTime;
@Column(name = "last_error")
private String lastError;
private String url;
private String name;
public enum Status {
INDEXING, INDEXED, FAILED
}
}
系結非常簡單:
package main.utilities;
import lombok.Getter;
import lombok.Setter;
import main.model.Site;
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.List;
@ConfigurationProperties
public class ApplicationProperties {
@Getter
@Setter
private List<Site> sites;
}
在應用程式的某個地方,我正在測驗該系結,假設我在 API 中創建了端點來測驗該系結,即我的控制器呼叫一個方法,該方法只列印串列中的所有物件:
package main.application.indexer;
import main.utilities.ApplicationProperties;
import org.springframework.beans.factory.annotation.Autowired;
public class IndexBuilder {
@Autowired
private ApplicationProperties properties;
public void run() {
System.out.println(properties.getSites());
}
}
預期的:
啟動后,ApplicationProperties 實體不為空。呼叫 properties.getSites() 會回傳一個 Site 物件串列。每個 Site 物件都有從 yaml 源初始化的 url 和 name 欄位。
實際的:
啟動后 ApplicationProperties 實體為空。
I was shocked to realize that Spring wasn't able to accomplish such a simple binding. Knowing that just parsing a yaml file is not such a hard task to accomplish, I thought that Spring Framework should have this feature build-in. How do I bind my list?
By the way, here is my project structure.

UPDATE:
I edited IndexBuilder class. Added @Configuration and @Bean annotations. Now it looks like this:
package main.application.indexer;
import main.utilities.ApplicationProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class IndexBuilder {
@Autowired
private ApplicationProperties properties;
@Bean
public void run() {
System.out.println(properties.getSites());
}
}
That fixed the problem with initialization, but Spring Framework just call run() immideately after launch. That isn't an expected behavior.
uj5u.com熱心網友回復:
事實證明,Spring 并沒有我想象的那么聰明。
要訪問@ConfigurationProperties 類,即:從非管理的 spring 類訪問 bean,-我必須閱讀這篇文章:https : //dzone.com/articles/autowiring-spring-beans-into-類非春季管理
它解決了這個問題,但是……真可惜,因為我希望 Spring Framework 自動將所需的資源注入任何類,而沒有一些曼波巨無霸的東西。
uj5u.com熱心網友回復:
而不是使用@Configuration你應該@Component在你的IndexBuilder班級上使用。
@Configuration應該只用于定義應用程式 bean 的配置類。在這里,實際上期望注釋的方法@Bean在應用程式啟動時立即執行。這是 spring 創建所有需要的 bean 的階段。但是我想知道 spring 接受void帶有@Bean注釋的方法。
應該執行 run 方法的預期時間是多少?例如,對于普通的 bean/組件/服務,您可以@PostConstruct在方法上使用注釋。然而,這些將在與@Bean方法相同的階段執行,或者至少不會太晚。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/373532.html
標籤:java spring-boot yaml
上一篇:如何將Base64發送到API
