Spring 启动将属性读取到 Map 中



我正在尝试从 Spring boot 3.1 中的 .properties 文件创建一个Map<String, Product>。我已经为此编写了自定义转换器,但似乎它从未执行过。我以前没有做过自定义转换,我不确定在这个用例中是否需要转换器,或者 Spring 启动是否能够自动管理转换(如果我配置正确(。

产品配置属性:

products.product[0].name=FirstProduct
products.product[0].productID=1234
products.product[0].availableOptions=Opt1
products.product[0].processing=Parallel

产品类别:

import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class Product {
private String name;
private String processing;
private String availableOptions;
private Integer productID;
}

配置类:

import java.util.List;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import lombok.Getter;
import lombok.Setter;
@Configuration
@PropertySource("classpath:product-configurations.properties")
@ConfigurationProperties("products")
@Getter
@Setter
public class ProductProperties {
private List<Product> product;
}

产品转换器类:

import java.util.List;
import java.util.Map;
import org.springframework.boot.context.properties.ConfigurationPropertiesBinding;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;
import com.cb.clientfacingapp.model.Product;
@Component
@ConfigurationPropertiesBinding
public class ProductConverter implements Converter<List<Product>, Map<String, Product>> {
@Override
public Map<String, Product> convert(List<Product> source) {
Product p = new Product();
System.out.println("I am converting");
return null;
}
}

有人可以指导我吗?

提前谢谢。

更新:

对不起,我忘了提到地图应该如何组织。

Map<String, Product>其中 String 基本上是产品的name属性,Product是该特定产品的 POJO 类,因此每个产品基本上都映射到其名称。

你可以按照@Daria的建议去做,这是更简单的方法。

如果您仍然想知道如何将列表转换为地图,可以使用 Streams 来完成:

import java.util.List;
import java.util.Map;
import org.springframework.boot.context.properties.ConfigurationPropertiesBinding;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;
import com.cb.clientfacingapp.model.Product;
@Component
@ConfigurationPropertiesBinding
public class ProductConverter implements Converter<List<Product>, Map<String, Product>> {
@Override
public Map<String, Product> convert(List<Product> source) {
return source.stream().collect(
Collectors.toMap(Product::getName,Function.identity));
}
}

它将生成一个映射,其中产品名称作为键值,产品对象作为内容值。

似乎您要实现的目标无需转换即可完成

root.products.productName1.name=FirstProduct
root.products.productName1.productID=1234
root.products.productName1.availableOptions=Opt1
root.products.productName1.processing=Parallel
root.products.productName2.name=SecondProduct
root.products.productName2.productID=5678
root.products.productName2.availableOptions=Opt2
root.products.productName2.processing=Parallel

因此productName1productName2将是您的映射键名。

您可以通过以下方式使用它:

@ConfigurationProperties("root")
@Getter
@Setter
public class ProductProperties {
private Map<String, Product> products;
}

最新更新