2015-11-19 2 views
3

Мне нужно обратиться за помощью по следующей проблеме. Я читаю некоторые свойства из файла свойств и присваиваю измененные/окончательные значения другим переменным. Мне приходится сталкиваться с трудностями при изменении статического блока {} на обычный блок или в конструкторе.Статический блок не работает с @Value весной

Я хочу, чтобы все эти переменные получили значение назначения из файла .properties во время загрузки/развертывания веб-приложения. Любая помощь ?

private static String username; 
private static String password; 
private static String dbURL; 
private static String dbPort; 
private static String filePath; 
private static File localFile; 
private static File remoteFile; 


@Value("${local.file.name}") 
private String localFileName; 

@Value("${remote.file.name"}) 
private String remoteFileName; 

    static { 
     File finalFilePath = new File(filePath); 
     if (!finalFilePath.exists() && !finalFilePath.isDirectory()) { 
      finalFilePath.mkdirs(); 
     } 
     localFile = new File(StringBuffer(finalFilePath).append("/").append("localFileName").toString()); 
     remoteFile = new File(StringBuffer(finalFilePath).append("/").append("remoteFileName").toString()); 
    } 
+0

в каком классе эти свойства (весна-управляемый компонент ?, компонент, обслуживание, Repository, конфигурации)? это работает? (тест путем отладки какой-либо инструкции в аннотированном методе PostConstruct) – cproinger

+0

Пожалуйста, не используйте StringBuffer, поскольку он был заменен StringBuilder более десяти лет назад. В этом случае использование '+' было бы более эффективным и понятным для чтения. –

ответ

-1

Проверьте файл свойств находится в пути к классам, а также, что ваш класс помечается как Spring компонента

2

Вы можете реализовать метод с аннотацией @PostConstruct (или реализации InitializingBean и реализации afterPropertiesSet) и установите значения там , Spring будет вызывать этот метод после инициализации бина во время загрузки приложения.

3

Это никогда не сработает. static блок исполнение бывает перед началом срока службы. Spring добавит эти значения свойств (@Value) после создания экземпляра, поэтому, как сказал jny, вам нужно использовать, например, @PostConstructor (или любую другую пружину параметра) для инициализации вместо статической инициализации блока.

Edit: (добавить пример)

@Value("${local.file.name}") 
private String localFileName; 

@Value("${remote.file.name"}) 
private String remoteFileName; 


@PostConstruct 
public void setup() { 
     File finalFilePath = new File(filePath); // assume filePath is already injected 
     if (!finalFilePath.exists() && !finalFilePath.isDirectory()) { 
      finalFilePath.mkdirs(); 
     } 
     localFile = new File(StringBuffer(finalFilePath).append("/").append("localFileName").toString()); 
     remoteFile = new File(StringBuffer(finalFilePath).append("/").append("remoteFileName").toString()); 
} 

Таким образом, у меня есть localFile и remoteFile переменные, готовые к использованию в этом компоненте, после инициализации.

Другие примеры здесь: http://www.journaldev.com/2637/spring-bean-life-cycle-methods-initializingbean-disposablebean-postconstruct-predestroy-aware-interfaces

+0

Благодарим вас за предложение. Не могли бы вы предоставить образец проекта для этого? Спасибо, Саяли –

Смежные вопросы