【问题标题】:How do I represent a map of lists in a Spring properties file [closed]如何在 Spring 属性文件中表示列表映射 [关闭]
【发布时间】:2021-06-25 06:24:29
【问题描述】:

如何在 Spring .properties 文件中表示 Map<String, List<String>>

为了给出问题的示例场景,我希望能够将以下内容添加到@Component

@Autowired
private Map<String, List<String>> animalHabitats;

...并从.properties 文件中将以下动物栖息地信息注入其中:

  • 首页:狗、猫、金鱼
  • 农场:绵羊、山羊
  • 动物园:狮子、长颈鹿

【问题讨论】:

    标签: java spring dependency-injection properties-file


    【解决方案1】:

    Spring 开箱即用,但安排起来并不那么直观。

    创建您的.properties 文件:

    在本例中,我们将在/src/main/resources 中创建一个habitats.properties

    my-habitats={ \
      home: {'dog', 'cat', 'goldfish'}, \
      farm: {'sheep', 'goat'}, \
      zoo: {'lion', 'giraffe'} \
    }
    

    创建一个@Configuration 类:

    @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类:

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

    然后把配置类中的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;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-09-21
      • 1970-01-01
      • 2011-06-13
      • 2021-09-27
      • 2012-06-19
      • 2019-02-27
      • 2021-07-13
      • 1970-01-01
      • 2022-01-01
      相关资源
      最近更新 更多