spring - считывает значение свойства из файла свойств в статическом поле класса

1

У меня есть один класс утилиты, где у меня есть один метод, который требует имя пользователя и пароль для подключения другого URL-адреса. Мне нужно сохранить это имя пользователя в файле свойств, чтобы я мог изменить его в любое время. Но поскольку я использую его в статическом методе (являющемся классом утилиты), проблема заключается в том, что он показывает значение null. (Т. Е. Он не может читать из файла свойств).

Но когда я скрепил эти значения в каком-то другом контроллере, они туда попадают. Поэтому мой вопрос заключается в том, как прочитать значение свойства в статическом поле

<bean
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>classpath*:/myservice_detaults.properties</value>
            <value>classpath*:/log4j.properties</value>
        </list>
    </property>
</bean>

//в коде класса Utitlity

  @Value("${app.username}")
      static String userName;

public static connectToUrl(){
  //use userName
 //userName showing null
}
  • 0
    Как загружается / вводится ваш служебный класс?
  • 0
    Мой служебный класс - это обычный класс, а не класс Spring, и он вызывает connectToUrl как обычный статический вызов.
Показать ещё 3 комментария
Теги:
spring
spring-mvc
properties

5 ответов

10
Лучший ответ

В вашем классе Utility вы можете установить метод setter для установки свойств, а затем вы можете использовать MethdInvokingFactoryBean.

class Utility{
    static String username;
    static String password;
    public static setUserNameAndPassword(String username, String password){
        Utility.username = username;
        Utility.password = password;
    }
    //other stuff
}

<bean
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>classpath*:/myservice_detaults.properties</value>
            <value>classpath*:/log4j.properties</value>
        </list>
    </property>
</bean>

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="staticMethod" value="foo.bar.Utility.setUserNameAndPassword"/>
    <property name="arguments">
        <list>
            <value>${username}</value>
            <value>${password}</value>
        </list>
   </property>
</bean>
  • 0
    Спасибо, это работает.
3
Read property value from properties file in static field of class using Java based spring configuration.
Example :
// The property file to store fields.
user.properties
     username=Elijah Wood
     age=26
     language=English
// This class holds the static values

пакет org.javahive.propertyreader.example;

public class UserDetails {

    static String username;
    static String age;
    static String language;

    public static void setUserValues(String username, String age, String language) {
        UserDetails.username = username;
        UserDetails.age = age;
        UserDetails.language = language;
    }
}

//Spring configuration class

package org.javahive.propertyreader.example;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.config.MethodInvokingFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;

@Configuration
@ComponentScan(value = { "org.javahive.propertyreader.example" })
@PropertySource("classpath:user.properties")
public class PropertyReaderConfig {

    @Value("${user}")
    private String username;

    @Value("${age}")
    private String age;

    @Value("${language}")
    private String language;

    @Bean
    public static PropertySourcesPlaceholderConfigurer propertyConfigIn() {
        return new PropertySourcesPlaceholderConfigurer();
    }

    @Bean
    public MethodInvokingFactoryBean methodInvokingFactoryBean() {
        MethodInvokingFactoryBean mifb = new MethodInvokingFactoryBean();
        mifb.setStaticMethod("org.javahive.propertyreader.example.UserDetails.setUserValues");
        mifb.setArguments(new String[] { this.username, this.age, this.language });
        return mifb;
    }

    /**
     * @return the name
     */
    public String getName() {
        return username;
    }

    /**
     * @param name
     *            the name to set
     */
    public void setName(String name) {
        this.username = name;
    }

    /**
     * @return the age
     */
    public String getAge() {
        return age;
    }

    /**
     * @param age
     *            the age to set
     */
    public void setAge(String age) {
        this.age = age;
    }

    /**
     * @return the language
     */
    public String getLanguage() {
        return language;
    }

    /**
     * @param language
     *            the language to set
     */
    public void setLanguage(String language) {
        this.language = language;
    }

}

//The main class.

пакет org.javahive.propertyreader.example;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {

    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(PropertyReaderConfig.class);
        System.out.println("User Name : " + UserDetails.username);
        System.out.println("Age : " + UserDetails.age);
        System.out.println("Language : " + UserDetails.language);
    }
}
1

Или используйте @Value по методу нестатического метода @Value для username например.

@Value("${app.username}")
public void setUserName(String userName) {
    UtilityClass.userName = userName;
}
  • 0
    Большое спасибо, это сработало для меня!
  • 0
    Отлично! Это попало в глаза быков.
0

Или просто

<bean id="constants" class="com.foo.constants.CommonConstants">
    <property name="username" value="${username}"/>
</bean>
0

Spring не позволяет вводить значения в не конечные статические поля, но делает ваше поле частным, и оно должно работать.

  • 1
    Вы хотели бы указать любую ссылку, где эта информация дается

Ещё вопросы

Сообщество Overcoder
Наверх
Меню