Обработка файла свойств yaml загрузки boot [duplicate]

Это переписывание большого сообщения @Kay, которое бросает IOException и обеспечивает ранний выход:

/**
 * Gets image dimensions for given file 
 * @param imgFile image file
 * @return dimensions of image
 * @throws IOException if the file is not a known image
 */
public static Dimension getImageDimension(File imgFile) throws IOException {
  int pos = imgFile.getName().lastIndexOf(".");
  if (pos == -1)
    throw new IOException("No extension for file: " + imgFile.getAbsolutePath());
  String suffix = imgFile.getName().substring(pos + 1);
  Iterator<ImageReader> iter = ImageIO.getImageReadersBySuffix(suffix);
  while(iter.hasNext()) {
    ImageReader reader = iter.next();
    try {
      ImageInputStream stream = new FileImageInputStream(imgFile);
      reader.setInput(stream);
      int width = reader.getWidth(reader.getMinIndex());
      int height = reader.getHeight(reader.getMinIndex());
      return new Dimension(width, height);
    } catch (IOException e) {
      log.warn("Error reading: " + imgFile.getAbsolutePath(), e);
    } finally {
      reader.dispose();
    }
  }

  throw new IOException("Not a known image file: " + imgFile.getAbsolutePath());
}

Я думаю, что мой репутатор недостаточно высок, чтобы мой вклад считался достойным ответ.

18
задан theadam 3 December 2015 в 17:18
поделиться

3 ответа

Небольшая ревизия ответа @fivetenwill, который работает для меня в Spring Boot 1.4.3.RELEASE:

foo:
  "[bar.com]":
    a: b
  "[baz.com]":
    a: c

Вам нужны скобки, которые должны быть внутри кавычек, в противном случае парсер YAML в основном отбрасывает их до того, как они доберутся до Весны, и они не попадают в название свойства.

29
ответ дан pioto 19 August 2018 в 19:17
поделиться
  • 1
    Отличный ответ. Скобки внутри кавычек работали! – Erik Kaju 1 September 2017 в 10:53
  • 2
    Это должен быть принятый ответ! – Andy Brown 6 September 2017 в 09:33
  • 3
    Это тоже помогло мне – Rites 29 October 2017 в 08:01
  • 4
    @AndyBrown взял меня на некоторое время, чтобы понять, что у нас есть рабочее решение. Принято. Больше не имеет отношения ко мне, но отлично, это работает! – theadam 12 January 2018 в 16:41

Это должно работать:

foo:
  ["bar.com"]:
    a: b
  ["baz.com"]:
    a: c

Вдохновленный из Связывание конфигурации загрузки Spring Wiki

1
ответ дан fivetenwill 19 August 2018 в 19:17
поделиться

Это невозможно, если вы хотите автоматическое сопоставление ключей yaml с атрибутами Java bean. Причина в том, что Spring сначала конвертирует YAML в формат свойств. См. Раздел 24.6.1 ссылки ниже:

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

Итак, ваш YAML преобразуется в:

foo.bar.com.a=b
foo.baz.com.a=c

Выше ключи анализируются как стандартные свойства.

Как работа, вы может использовать Spring YamlMapFactoryBean для создания карты Yaml. Затем вы можете использовать эту карту для создания Java-компонентов по своему усмотрению.

@Configuration
public class Config {

    private Map<String, Object> foo;

    @Bean
    public Map<String, Object> setup() {
        foo = yamlFactory().getObject();
        System.out.println(foo); //Prints {foo={bar.com={a=b}, baz.com={a=c}}}
        return foo;
    }

    @Bean
    public YamlMapFactoryBean yamlFactory() {
        YamlMapFactoryBean factory = new YamlMapFactoryBean();
        factory.setResources(resource());
        return factory;
    }

    public Resource resource() {
        return new ClassPathResource("a.yaml"); //a.yaml contains your yaml config in question
    }

}
4
ответ дан Mohit 19 August 2018 в 19:17
поделиться
  • 1
    Любой способ заставить YamlMapFactoryBean вернуть карту определенных экземпляров Bean вместо карты карт? Любой способ вернуть карту из определенного узла конфигурации? Мой yml более сложный, конфигурация карты - лишь часть его, и я бы предпочел не разделить конфигурацию карты для отдельной конфигурации. Вышеприведенный код достаточно хакерский для меня :) – theadam 4 December 2015 в 12:05
  • 2
    Я с тобой согласен. Над кодом немного работать. Но чтобы получить максимальную конфигурацию от пружины, я боюсь, вам придется отказаться от точек в ваших ключах ямля. В противном случае в методе setup () выше вы можете выполнить итерацию объекта yaml и создать beans вручную (это может вызвать проблемы с автоматической проводкой). – Mohit 4 December 2015 в 13:31
  • 3
    Да, я понимаю. Тем не менее, я попытаюсь найти, как Spring автоустанавливает это и, возможно, есть способ сделать это autowire из карты, а не из свойств :) – theadam 4 December 2015 в 14:27
Другие вопросы по тегам:

Похожие вопросы: