Какова наилучшая практика для чтения файлов свойств в Java EE?

У меня есть несколько веб-приложений Java EE, работающих внутри одного и того же сервера приложений, и я хотел экпортировать файлы свойств, которые находятся внутри баннеров, в новый каталог, чтобы сделать эти свойства видимыми.

Каков рекомендуемый способ загрузки этих файлов свойств?

Ответ 1

Лично я использую класс java.util.Properties и использую метод load() для loadproperties.

InputStream inputStream  = MyProperties.class.getClassLoader().getResourceAsStream("file.properties");
this.properties = new Properties();
this.properties.load(inputStream);

Затем я использую метод get() для чтения свойств в виде строк.

Ответ 2

Если вы используете Spring, приятно абстрагироваться от кода, в котором есть даже файл свойств, и использовать PropertyPlaceHolderConfigurer. Это позволяет вытеснить свойства из определения BeanFactory в стандартный файл свойств Java.

Пример (вырванный из документов spring):

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <value>classpath:com/foo/jdbc.properties</value>
    </property>
</bean>

<bean id="dataSource" destroy-method="close"
      class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="${jdbc.driverClassName}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>

Ответ 3

Если вы используете JBoss, вы можете создать файл службы свойств (с именем something-service.xml)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE server>

<server>    
  <mbean code="org.jboss.varia.property.SystemPropertiesService" 
           name="jboss:type=Service,name=MySystemProperties">        
    <attribute name="Properties">
       property_a=value a
       property_b=value b
    </attribute>         
  </mbean>
</server>

Скопируйте это в свой каталог развертывания, и свойства будут доступны с помощью System.getProperty()

Ответ 4

Вы можете использовать механизм конфигурации Apache DeltaSpike, который является CDI.

В соответствии с documentation:

Существует несколько различных API и способов доступа к индивидуальному сконфигурированные значения, каждый из которых подходит для другой цели:

  • ConfigResolver методы для простого программного доступа к значениям

  • TypedResolver API для типизированных значений конфигурации и точного управления над разрешением

  • @ConfigProperty для ввода настроенных значений в beans


@ConfigProperty

Этот API позволяет вводить значения свойств в ваш beans и может быть использован в несколько этапов:

1. Создайте файл свойств (должен находиться в пути к классам)

database.user = admin
database.password = 123456

2. Внедрить PropertyFileConfig интерфейс

Итак, Apache DeltaSpike будет знать, как найти файл свойств:

public class MyCustomPropertyFileConfig implements PropertyFileConfig {

    @Override
    public String getPropertyFileName() {
        return "myconfig.properties";
    }

    @Override
    public boolean isOptional() {
        return false;
    }
}

3. Внесите значения

Используйте @Inject и @ConfigProperty для ввода значений в beans:

@ApplicationScoped
public class MyBean {

    @Inject
    @ConfigProperty(name = "database.user")
    private String user;

    @Inject
    @ConfigProperty(name = "database.password")
    private String password;

    // Getters and setter ommitted
}

Подробнее о Механизм конфигурации DeltaSpike.


В этой ссылке вы найдете некоторую информацию о том, как настроить Apache DeltaSpike в вашем проекте.
Если вы используете Maven, в основном добавьте следующие зависимости к вашему pom.xml:

<properties>
    <deltaspike.version>1.5.0</deltaspike.version>
</properties>

<dependency>
    <groupId>org.apache.deltaspike.core</groupId>
    <artifactId>deltaspike-core-api</artifactId>
    <version>${deltaspike.version}</version>
    <scope>compile</scope>
</dependency>

<dependency>
    <groupId>org.apache.deltaspike.core</groupId>
    <artifactId>deltaspike-core-impl</artifactId>
    <version>${deltaspike.version}</version>
    <scope>runtime</scope>
</dependency>

Проверьте версию Apache DeltaSpike, доступную на Репозиторий Maven.

Ответ 5

В этой ссылке есть несколько советов. Вы можете использовать ResourceBundle или сделать что-то вроде этого:

// Assuming you are in a Servlet extending HttpServlet 
// This will look for a file called "/more/cowbell.properties" relative
// to your servlet Root Context
InputStream is = getServletContext().getResourceAsStream("/more/cowbell.properties");
Properties  p  = new Properties();
p.load(is);
is.close();

Рекомендуемый способ для меня - пойти с Spring, как предложил другой ответ.