@value( ${} ) в spring не работает

179
02 мая 2019, 19:40

Пишу приложение на java с использованием Spring. Нужно передать значение ключа из файла app.properties в поле класса. Передает null. Выскакивает NullPointerException, уже не знаю что и делать, помогите кто чем может

конфигурация spring:

<context:property-placeholder location="classpath:/app.properties"/>
<context:component-scan base-package="com"/>
<context:annotation-config/>
<mvc:annotation-driven />
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="classpath:app.properties"/>
</bean>

файл properties:

price=^[1-9][0-9.]{0,10}

в классе:

import org.springframework.beans.factory.annotation.Value;
....
@Value("${price}")
private String price;
private Pattern PRICE_REGEX = Pattern.compile(price);
Answer 1

@Value("${price}") в твоём случае работает. Другое дело, что ты вызываешь private Pattern PRICE_REGEX = Pattern.compile(price); до того, как отработает @Value. Тебе надо перенести логику инициализации PRICE_REGEX в post-конструктор. На выходе должно получиться примерно так:

import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.regex.Pattern;
@Component
public class Question909652 implements InitializingBean {
    @Value("${price}")
    private String price;
    private Pattern PRICE_REGEX;
    @Override
    public void afterPropertiesSet() throws Exception {
        PRICE_REGEX = Pattern.compile(price);
    }
}

Ну или можно похитрить и использовать всю мощь SpEL

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.regex.Pattern;
@Component
public class Question909652 {
    @Value("#{T(java.util.regex.Pattern).compile('${price}')}")
    private Pattern PRICE_REGEX;
}

P.S. Как правильно заметил @Qwertiy, у тебя очень странное регулярное выражение для цены, быть может тебе больше подойдёт [0-9]*([.][0-9]{1,2})?

Answer 2

Добавь аннотацию @PropertySource("classpath:app.properties").

READ ALSO
foreach not applicable to type org.json.JSONArray

foreach not applicable to type org.json.JSONArray

Конструкцию цикла for последнее время принято записывать упощённо без явного использования индекса, вроде бы понятно как это делать и всегда...

170
принципы ООП или код не должен повторяться

принципы ООП или код не должен повторяться

Сейчас изучаю Java и усваиваю главные принципы ООП, хочу избежать повторяющегося однотипного кодаНиже я привел простой пример считывания...

151
Прикрепление json-файла из body для запроса

Прикрепление json-файла из body для запроса

Необходимо сделать много различных post запросов и хотелось бы заранее считывать изjson файла информацию для добавления в тело запроса

172
как зафиксировать строки и столбцы?

как зафиксировать строки и столбцы?

Есть div main, содержащий в себе div targetКак сделать при помощи flexbox так чтобы при изменении масштаба блоки target находились на своём месте?

161