Приведение типа аннотации @Value к Integer из String

Я пытаюсь преобразовать вывод значения в целое число:

@Value("${api.orders.pingFrequency}")
private Integer pingFrequency;

Выше выдает ошибку

org.springframework.beans.TypeMismatchException: 
    Failed to convert value of type 'java.lang.String' to required type 'java.lang.Integer'; 
nested exception is java.lang.NumberFormatException: 
    For input string: "(java.lang.Integer)${api.orders.pingFrequency}"

Я также пробовал @Value("(java.lang.Integer)${api.orders.pingFrequency}")

Google, похоже, мало что говорит по этому вопросу. Я хотел бы всегда иметь дело с целым числом вместо того, чтобы анализировать это значение везде, где оно используется.

Временное решение

Я понимаю, что обходным путем может быть использование метода установки для запуска преобразования для меня, но если Spring может это сделать, я бы предпочел узнать что-нибудь о Spring.


person Webnet    schedule 13.03.2013    source источник
comment
Исключение для первой попытки или для второй?   -  person Sotirios Delimanolis    schedule 13.03.2013
comment
@SotiriosDelimanolis Первый   -  person Webnet    schedule 13.03.2013
comment
Если вы когда-либо сталкивались с такой проблемой, наиболее очевидно, что вы забыли определить правильный источник свойств. Вам понадобится: @Bean public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { return new PropertySourcesPlaceholderConfigurer(); }   -  person Dudelilama    schedule 01.03.2016
comment
это также может быть вызвано неправильной кодировкой файлов свойств (java ожидает ISO 8859-1)   -  person Poutrathor    schedule 06.05.2020
comment
Отсутствие фигурной скобки в конце заполнителя свойства вызвало у меня эту ошибку:/   -  person ununiform    schedule 22.06.2021


Ответы (10)


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

api.orders.pingFrequency=4

Я пытался внутри @Controller

@Controller
public class MyController {     
    @Value("${api.orders.pingFrequency}")
    private Integer pingFrequency;
    ...
}

С моим контекстом сервлета, содержащим:

<context:property-placeholder location="classpath:myprops.properties" />

Это сработало отлично.

Таким образом, либо ваше свойство не является целочисленным типом, либо у вас неправильно настроен заполнитель свойства, либо вы используете неправильный ключ свойства.

Я попытался запустить с недопустимым значением свойства, 4123;. Исключение, которое я получил, это

java.lang.NumberFormatException: For input string: "4123;"

что заставляет меня думать, что стоимость вашей собственности

api.orders.pingFrequency=(java.lang.Integer)${api.orders.pingFrequency}
person Sotirios Delimanolis    schedule 13.03.2013

Я искал ответ в Интернете, и я нашел следующее

@Value("#{new java.text.SimpleDateFormat('${aDateFormat}').parse('${aDateStr}')}")
Date myDate;

Итак, в вашем случае вы можете попробовать с этим

@Value("#{new Integer('${api.orders.pingFrequency}')}")
private Integer pingFrequency;
person Piero Divasto    schedule 13.03.2013
comment
Это дает мне SpelEvaluationException. Вы уверены, что это работает? - person Pablo Jomer; 20.01.2016
comment
Я также получаю SpelEvaluationException - person Saurabh; 10.03.2016
comment
Вместо «нового Integer.parseInt» у меня сработало «новое целое число». - person Saurabh; 10.03.2016
comment
Я получаю java.lang.NumberFormatException: для входной строки: ${redis.server.port}" - person Kanagavelu Sugumar; 12.11.2016
comment
Убедитесь, что вы не пропускаете $ @Value(${api.orders.pingFrequency}) должно работать нормально - person Bright Dodo; 10.09.2019

Если вы хотите преобразовать свойство в целое число из файла свойств, я нашел 2 решения:

Данный сценарий: customer.properties содержит customer.id = 100 в качестве поля, и вы хотите получить к нему доступ в файле конфигурации spring как целое число. свойство customerId объявлено как тип int в Bean-компоненте Customer.

Решение 1:

<property name="customerId" value="#{T(java.lang.Integer).parseInt('${customer.id}')}" />

В приведенной выше строке значение string из файла свойств преобразуется в тип int.

Решение 2. Используйте другое расширение вместо propeties. Например. Если имя вашего файла свойств customer.properties, сделайте его customer.details. > и в файле конфигурации используйте приведенный ниже код

<property name="customerId"  	value="${customer.id}" />

person ajay    schedule 07.12.2014

У меня была точно такая же ситуация. Это было вызвано отсутствием PropertySourcesPlaceholderConfigurer в контексте Spring, который сопоставляет значения с аннотацией @Value внутри классов.

Включите заполнитель свойства, чтобы решить проблему, нет необходимости использовать выражения Spring для целых чисел (файл свойств может не существовать, если вы используете ignore-resource-not-found="true"):

<context:property-placeholder location="/path/to/my/app.properties"
    ignore-resource-not-found="true" />
person this    schedule 19.05.2015

Если вы используете @Configuation, создайте экземпляр ниже статического компонента. Если @Configutation не является статическим, экземпляр @Configutation создается очень рано, и BeanPostProcessors, ответственные за разрешение аннотаций, таких как @Value, @Autowired и т. д., не могут на него воздействовать. См. здесь

@Bean
public static PropertySourcesPlaceholderConfigurer propertyConfigurer() {
   return new PropertySourcesPlaceholderConfigurer();
}
person V N    schedule 23.03.2017
comment
Чтобы добавить к вышесказанному, учитывая, что конфигуратор свойств @Bean будет отображаться только в одном классе конфигурации, следует соблюдать осторожность при удалении любого класса конфигурации из вашей кодовой базы, что может непреднамеренно удалить этот компонент. - person Tim Biegeleisen; 25.07.2019

У меня была та же проблема, которую я решил, используя это. Обратитесь к этому Spring MVC: аннотация @Value чтобы получить значение int, определенное в файле *.properties

@Value(#{propertyfileId.propertyName})

работает

person Saurabh    schedule 29.02.2016
comment
Извините, но это не работает. #{...} выдает ошибку компиляции. Вместо этого вы можете использовать int, а не Integer... - person Stefano Scarpanti; 23.07.2018

Эта проблема также возникает, когда у вас есть 2 ресурса с одинаковым именем файла; скажем, «configurations.properties» в двух разных файлах jar или пути к каталогу, настроенном в пути к классам. Например:

У вас есть свои «configurations.properties» в вашем процессе или веб-приложении (jar, war или ear). Но другая зависимость (jar) имеет тот же файл «configurations.properties» по тому же пути. Тогда я полагаю, что Spring понятия не имеет (@_@?), где взять свойство, и просто отправляет имя свойства, объявленное в аннотации @Value.

person Gabriel Villacis    schedule 03.10.2016

В моем случае проблема заключалась в том, что мой POST-запрос был отправлен на тот же URL-адрес, что и GET (с параметрами получения с использованием «?..=..»), и эти параметры имели то же имя, что и параметры формы. Вероятно, Spring объединяет их в массив, и синтаксический анализ выдает ошибку.

person Krystian    schedule 18.12.2016

при использовании @Value вы должны добавить аннотацию @PropertySource к классу или указать владельца свойств в XML-файле spring. например.

@Component
@PropertySource("classpath:config.properties")
public class BusinessClass{
   @Value("${user.name}")
   private String name;
   @Value("${user.age}")
   private int age;
   @Value("${user.registed:false}")
   private boolean registed;
}

config.properties

user.name=test
user.age=20
user.registed=true

это работает!

Конечно, вместо аннотаций вы можете использовать XML-конфигурацию-заполнитель. весна.xml

<context:property-placeholder location="classpath:config.properties"/>
person warhead    schedule 30.03.2018

Поскольку использование @Value(new Long(myconfig)) с приведением может выдать ошибку при запуске, если конфигурация не найдена< /strong> или, если не в том же ожидаемом числовом формате

Мы использовали следующий подход и работаем, как и ожидалось, с проверкой отказоустойчивости.

@Configuration()
public class MyConfiguration {

   Long DEFAULT_MAX_IDLE_TIMEOUT = 5l;

   @Value("db.timeoutInString")
   private String timeout;

   public Long getTimout() {
        final Long timoutVal = StringUtil.parseLong(timeout);
        if (null == timoutVal) {
            return DEFAULT_MAX_IDLE_TIMEOUT;
        }
        return timoutVal;
    }
}
   
person Mukundhan    schedule 13.07.2020