java 如何使用application.yaml创建复合pojo

n3ipq98p  于 2023-03-11  发布在  Java
关注(0)|答案(2)|浏览(131)

我有一个复合pojo像下面

class Employee {  
   String name;
   String department;
   Address address;
} 

class Address {
   String Street;
   String HouseNo;
   String postCode;
}

有没有办法在application.yml文件中创建属性,并在应用程序启动时为Employee创建bean列表?

oug3syen

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的主类上,添加注解以启用配置属性处理。

@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。

bvjxkvbb

bvjxkvbb2#

让我们从您要实现的内容开始。您有一个Composite类,它由一个Employee和一个Address组成。您希望从yaml配置文件中创建一个Employee对象及其对应的Address对象的列表。
要做到这一点,你需要用一种特定的方式来定义你的yaml属性,这种方式要与你的Composite类的结构相匹配。

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对象都有一个namedepartment和一个address对象,address对象还有自己的streethouseNopostCode属性。
要在应用程序启动时加载这个yaml文件,需要创建一个配置类,将yaml属性Map到Employee对象列表,下面是一个配置类的示例:

@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对象的列表:

@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对象列表。

相关问题