如何在 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;
}