如何在 Spring 属性文件中表示列表映射
How do I represent a map of lists in a Spring properties file
如何在 Spring .properties
文件中表示 Map<String, List<String>>
?
为了给出问题的示例场景,我希望能够将以下内容添加到 @Component
:
@Autowired
private Map<String, List<String>> animalHabitats;
...并从 .properties
文件中向其中注入以下动物栖息地信息:
- 家:狗、猫、金鱼
- 农场:绵羊、山羊
- 动物园:狮子、长颈鹿
Spring 开箱即用,但安排起来并不那么直观。
创建您的 .properties
文件:
在此示例中,我们将在 /src/main/resources
中创建一个 habitats.properties
:
my-habitats={ \
home: {'dog', 'cat', 'goldfish'}, \
farm: {'sheep', 'goat'}, \
zoo: {'lion', 'giraffe'} \
}
创建 @Configuration
class:
@Configuration
@PropertySource("classpath:/habitats.properties")
public class HabitatConfiguration {
@Bean
public Map<String, List<String>> getHabitatConfig(@Value("#{${my-habitats}}") Map<String, List<String>> habitats) {
return habitats;
}
}
将地图注入 @Component
class:
@Component
public class HabitatValidator {
private final Map<String, List<String>> habitats;
@Autowired
public HabitatValidator(Map<String, List<String>> habitats) {
this.habitats = habitats;
}
public void validateInput(String habitat, String animal) throws InvalidAnimalHabitatCombinationException {
if (!habitats.get(habitat).contains(animal)) {
throw new InvalidAnimalHabitatCombinationException("You won't find a " + animal + " in a " + habitat);
}
}
}
就是这样:)
让事情变得更安全
为了提高类型安全性,您可以用枚举替换字符串。只需确保属性文件中的值与枚举条目对齐即可。例如
在不改变habitats.properties
文件内容的情况下,添加以下两个枚举:
public enum Habitat {
home, farm, zoo
}
public enum Animal {
dog, cat, goldfish, sheep, goat, lion, giraffe
}
然后将配置class中的bean方法改成:
@Bean
public Map<Habitat, List<Animal>> getHabitatConfig(@Value("#{${my-habitats}}") Map<Habitat, List<Animal>> habitats) {
return habitats;
}
并像这样将其注入到组件中:
private final Map<Habitat, List<Animal>> habitats;
@Autowired
public HabitatValidator(Map<Habitat, List<Animal>> habitats) {
this.habitats = habitats;
}
如何在 Spring .properties
文件中表示 Map<String, List<String>>
?
为了给出问题的示例场景,我希望能够将以下内容添加到 @Component
:
@Autowired
private Map<String, List<String>> animalHabitats;
...并从 .properties
文件中向其中注入以下动物栖息地信息:
- 家:狗、猫、金鱼
- 农场:绵羊、山羊
- 动物园:狮子、长颈鹿
Spring 开箱即用,但安排起来并不那么直观。
创建您的 .properties
文件:
在此示例中,我们将在 /src/main/resources
中创建一个 habitats.properties
:
my-habitats={ \
home: {'dog', 'cat', 'goldfish'}, \
farm: {'sheep', 'goat'}, \
zoo: {'lion', 'giraffe'} \
}
创建 @Configuration
class:
@Configuration
@PropertySource("classpath:/habitats.properties")
public class HabitatConfiguration {
@Bean
public Map<String, List<String>> getHabitatConfig(@Value("#{${my-habitats}}") Map<String, List<String>> habitats) {
return habitats;
}
}
将地图注入 @Component
class:
@Component
public class HabitatValidator {
private final Map<String, List<String>> habitats;
@Autowired
public HabitatValidator(Map<String, List<String>> habitats) {
this.habitats = habitats;
}
public void validateInput(String habitat, String animal) throws InvalidAnimalHabitatCombinationException {
if (!habitats.get(habitat).contains(animal)) {
throw new InvalidAnimalHabitatCombinationException("You won't find a " + animal + " in a " + habitat);
}
}
}
就是这样:)
让事情变得更安全
为了提高类型安全性,您可以用枚举替换字符串。只需确保属性文件中的值与枚举条目对齐即可。例如
在不改变habitats.properties
文件内容的情况下,添加以下两个枚举:
public enum Habitat {
home, farm, zoo
}
public enum Animal {
dog, cat, goldfish, sheep, goat, lion, giraffe
}
然后将配置class中的bean方法改成:
@Bean
public Map<Habitat, List<Animal>> getHabitatConfig(@Value("#{${my-habitats}}") Map<Habitat, List<Animal>> habitats) {
return habitats;
}
并像这样将其注入到组件中:
private final Map<Habitat, List<Animal>> habitats;
@Autowired
public HabitatValidator(Map<Habitat, List<Animal>> habitats) {
this.habitats = habitats;
}