Как десериализовать серию application.properties для Map в Java - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть приложение Spring Boot, с application.properties, которое выглядит так

com.mycompany.schedule.test=welcome
com.mycompany.schedule.test2=hi there

Я бы хотел, чтобы они были десериализованы в Map

Я попробовал следующее,и другие варианты, но, похоже, не работает

  private Map<String, String> schedules;

  @Value("${com.mycompany.schedule}")
  public void setSchedules(Map<String, String> values) {
    this.schedules = values;
  }

1 Ответ

0 голосов
/ 06 ноября 2019

Опция 1:

В вашем классе конфигурации прочитайте файл application.properties, используя аннотацию @PropertySource, как показано ниже.

MyAppConfiguration.java

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration
@PropertySource(name = "customPropertySource", value = "classpath:application.properties")
public class MyAppConfiguration {

}

Затем в вашем POJO (или любом другом компоненте пружины) вы можете получить класс Environment для получения свойств.

MyPojo.java

import java.util.Map;

import javax.annotation.PostConstruct;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.io.support.ResourcePropertySource;
import org.springframework.stereotype.Component;

@Component
public class MyPojo {

    @Autowired
    private ConfigurableEnvironment env;

    private Map<String, Object> schedules;

    @PostConstruct
    public void properties() {
        Object propSourceObj = env.getPropertySources().get("customPropertySource");
        if (propSourceObj instanceof ResourcePropertySource) {
            ResourcePropertySource propSource = (ResourcePropertySource) propSourceObj;
            setSchedules(propSource.getSource());
        }
        System.out.println("Schedules: " + getSchedules());

    }

    public Map<String, Object> getSchedules() {
        return schedules;
    }

    public void setSchedules(Map<String, Object> schedules) {
        this.schedules = schedules;
    }

}

Обратите внимание, что с этой опцией вы читаете файл application.properties дважды. Если вы согласны с этим, вы можете выбрать вариант 1. В противном случае вы можете выбрать вариант 2.

Вариант 2:

MyAppConfiguration.java

import org.springframework.context.annotation.Configuration;

@Configuration
public class MyAppConfiguration {

}

MyPojo.java

import java.util.Map;

import javax.annotation.PostConstruct;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.env.OriginTrackedMapPropertySource;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.stereotype.Component;

@Component
public class MyPojo {

    @Autowired
    private ConfigurableEnvironment env;

    private Map<String, Object> schedules;

    @PostConstruct
    public void properties() {
        Object propSourceObj = env.getPropertySources().get("applicationConfig: [classpath:/application.properties]");
        if (propSourceObj instanceof OriginTrackedMapPropertySource) {
            OriginTrackedMapPropertySource propSource = (OriginTrackedMapPropertySource) propSourceObj;
            setSchedules(propSource.getSource());
        }
        System.out.println("Schedules: " + getSchedules());

    }

    public Map<String, Object> getSchedules() {
        return schedules;
    }

    public void setSchedules(Map<String, Object> schedules) {
        this.schedules = schedules;
    }

}

Редактировать:

Извините, ранее я неправильно понял ваш вопрос. Если вы знаете префикс свойства, вы можете использовать @ConfigurationProperties, как показано ниже. Вышеуказанные параметры предназначены для чтения всех свойств без знания префикса свойства.

MyAppConfiguration.java

import javax.annotation.PostConstruct;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyAppConfiguration {

    @Autowired
    private MyCompanyConfigurationProperties myCompanyConfProps;

    @PostConstruct
    public void testProperteis() {
        System.out.println("My Properties: " + myCompanyConfProps.getSchedule());
    }

}

MyCompanyConfigurationProperties.java

import java.util.HashMap;
import java.util.Map;

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = "com.mycompany")
public class MyCompanyConfigurationProperties {

    private Map<String, String> schedule = new HashMap<String, String>();

    public Map<String, String> getSchedule() {
        return schedule;
    }

    public void setSchedule(Map<String, String> schedule) {
        this.schedule = schedule;
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...