我有一个复合pojo像下面
class Employee { String name; String department; Address address; } class Address { String Street; String HouseNo; String postCode; }
有没有办法在application.yml文件中创建属性,并在应用程序启动时为Employee创建bean列表?
application.yml
oug3syen1#
是的,有。Spring使用配置属性来处理这个问题。下面是一个给定模型的示例。确保您的模型定义了适当的getter/setter。
@Data public class Employee { String name; String department; Address address; } @Data public class Address { String Street; String HouseNo; String postCode; }
将配置处理器依赖项添加到pom
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
在注解为@SpringBootApplication的主类上,添加注解以启用配置属性处理。
@SpringBootApplication
@EnableConfigurationProperties(EmployeeConfigurer.class)
创建将加载属性并将其公开为Bean的类
@Configuration @ConfigurationProperties(prefix = "application") public class EmployeeConfigurer { @Setter private List<Employee> employees; @Bean public List<Employee> employees() { return employees; } }
添加您的员工到您的yaml
application: employees: - name: Lane department: Mail address: Street: Elm HouseNo: 12 PostCode: 60012 - name: Bob department: Marketing address: Street: Main HouseNo: 42 PostCode: 61112
现在您有了一个bean,它是一个List<Employee>,您可以将它注入到任何您想要的地方。我想重申在评论中提出的观点,您绝对应该考虑从数据库加载这些bean。
List<Employee>
bvjxkvbb2#
让我们从您要实现的内容开始。您有一个Composite类,它由一个Employee和一个Address组成。您希望从yaml配置文件中创建一个Employee对象及其对应的Address对象的列表。要做到这一点,你需要用一种特定的方式来定义你的yaml属性,这种方式要与你的Composite类的结构相匹配。
Employee
Address
yaml
employees: - name: John Doe department: Sales address: street: 123 Main St houseNo: 4A postCode: 12345 - name: Jane Smith department: Marketing address: street: 456 Elm St houseNo: 10B postCode: 67890
在这个yaml文件中,您有一个名为employees的属性,它是Employee对象的列表,每个Employee对象都有一个name、department和一个address对象,address对象还有自己的street、houseNo和postCode属性。要在应用程序启动时加载这个yaml文件,需要创建一个配置类,将yaml属性Map到Employee对象列表,下面是一个配置类的示例:
employees
name
department
address
street
houseNo
postCode
@Configuration @ConfigurationProperties(prefix = "employees") public class EmployeeConfig { private List<Employee> employeeList; public List<Employee> getEmployeeList() { return employeeList; } public void setEmployeeList(List<Employee> employeeList) { this.employeeList = employeeList; } }
在这个配置类中,我们使用@ConfigurationProperties注解来指定yaml属性的前缀,即employees,我们还有一个名为employeeList的字段,类型为List<Employee>,它将在启动时用yaml属性填充。要在应用程序的其他部分使用EmployeeConfig类,只需将其作为依赖项注入即可,例如,可以创建一个RestController,它以JSON格式返回Employee对象的列表:
@ConfigurationProperties
employeeList
EmployeeConfig
RestController
@RestController public class EmployeeController { private final EmployeeConfig employeeConfig; public EmployeeController(EmployeeConfig employeeConfig) { this.employeeConfig = employeeConfig; } @GetMapping("/employees") public List<Employee> getEmployees() { return employeeConfig.getEmployeeList(); } }
在这个RestController中,我们将EmployeeConfig类作为依赖项注入到构造函数中,然后创建一个返回Employee对象列表的GET端点,当这个端点被命中时,Sping Boot 将自动用yaml属性填充employeeConfig字段,并返回Employee对象列表。
GET
employeeConfig
2条答案
按热度按时间oug3syen1#
是的,有。Spring使用配置属性来处理这个问题。下面是一个给定模型的示例。
确保您的模型定义了适当的getter/setter。
将配置处理器依赖项添加到pom
在注解为
@SpringBootApplication
的主类上,添加注解以启用配置属性处理。创建将加载属性并将其公开为Bean的类
添加您的员工到您的yaml
现在您有了一个bean,它是一个
List<Employee>
,您可以将它注入到任何您想要的地方。我想重申在评论中提出的观点,您绝对应该考虑从数据库加载这些bean。bvjxkvbb2#
让我们从您要实现的内容开始。您有一个Composite类,它由一个
Employee
和一个Address
组成。您希望从yaml
配置文件中创建一个Employee
对象及其对应的Address
对象的列表。要做到这一点,你需要用一种特定的方式来定义你的yaml属性,这种方式要与你的Composite类的结构相匹配。
在这个yaml文件中,您有一个名为
employees
的属性,它是Employee
对象的列表,每个Employee
对象都有一个name
、department
和一个address
对象,address
对象还有自己的street
、houseNo
和postCode
属性。要在应用程序启动时加载这个yaml文件,需要创建一个配置类,将yaml属性Map到
Employee
对象列表,下面是一个配置类的示例:在这个配置类中,我们使用
@ConfigurationProperties
注解来指定yaml属性的前缀,即employees
,我们还有一个名为employeeList
的字段,类型为List<Employee>
,它将在启动时用yaml属性填充。要在应用程序的其他部分使用
EmployeeConfig
类,只需将其作为依赖项注入即可,例如,可以创建一个RestController
,它以JSON格式返回Employee
对象的列表:在这个
RestController
中,我们将EmployeeConfig
类作为依赖项注入到构造函数中,然后创建一个返回Employee
对象列表的GET
端点,当这个端点被命中时,Sping Boot 将自动用yaml属性填充employeeConfig
字段,并返回Employee
对象列表。