@Value тип аннотации для целых чисел из 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, похоже, не говорит о многом. Я хотел бы всегда иметь дело с целым числом вместо того, чтобы анализировать это значение везде, где он использовался.
Обход
Я понимаю, что обходным путем может быть использование метода setter для запуска преобразования для меня, но если Spring может это сделать, я лучше узнаю что-нибудь о Spring.
Ответы
Ответ 1
Предполагая, что у вас есть файл свойств в вашем пути к классам, содержащий
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}
Ответ 2
Я искал ответ в Интернете, и я нашел следующее
@Value("#{new java.text.SimpleDateFormat('${aDateFormat}').parse('${aDateStr}')}")
Date myDate;
Итак, в вашем случае вы можете попробовать с этим
@Value("#{new Integer.parseInt('${api.orders.pingFrequency}')}")
private Integer pingFrequency;
Ответ 3
Если вы хотите преобразовать свойство в целое число из файла свойств, есть 2 решения, которые я нашел:
Данный сценарий: client.properties содержит customer.id = 100 как поле, и вы хотите получить к нему доступ в конфигурационном файле spring как целое число. Свойство customerId объявлено как тип int в Bean Клиент
Решение 1:
<property name="customerId" value="#{T(java.lang.Integer).parseInt('${customer.id}')}" />
Ответ 4
У меня была такая же ситуация. Это было вызвано отсутствием PropertySourcesPlaceholderConfigurer в контексте Spring, который разрешает значения против аннотации @Value
внутри классов.
Включите хранилище свойств для решения проблемы, не нужно использовать выражения Spring для целых чисел (файл свойств не должен существовать, если вы используете ignore-resource-not-found="true"
):
<context:property-placeholder location="/path/to/my/app.properties"
ignore-resource-not-found="true" />
Ответ 5
У меня была та же проблема, которую я решил использовать. Обратитесь к Spring аннотации MVC: @Value, чтобы получить значение int, определенное в файле *.properties
@Value(#{propertyfileId.propertyName})
работы
Ответ 6
Эта проблема также возникает, когда у вас есть 2 ресурса с одинаковым именем файла; скажем, "configurations.properties" в пределах 2 разных путей или пути к каталогам, настроенных в пути к классам. Например:
У вас есть ваши "configurations.properties" в вашем процессе или веб-приложении (банке, войне или ухе). Но другая зависимость (jar) имеет один и тот же файл "configurations.properties" в одном и том же пути. Тогда я полагаю, что Spring не имеет понятия (@_ @?), Где нужно получить свойство и просто отправляет имя свойства, объявленное в аннотации @Value.
Ответ 7
В моем случае проблема заключалась в том, что мой запрос POST был отправлен на тот же URL-адрес, что и GET (с получением параметров с использованием "?.. =.." ), и параметры имели то же имя, что и параметры формы. Вероятно, Spring объединяет их в массив, и синтаксический анализ бросает ошибку.
Ответ 8
Если вы используете @Configuation, тогда создайте экземпляр ниже статического bean. Если не статическая @Configutation создается очень рано, и BeanPostProcessors, ответственные за разрешение аннотаций, таких как @Value, @Autowired и т.д., Не могут воздействовать на нее. Обратитесь здесь
@Bean
public static PropertySourcesPlaceholderConfigurer propertyConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}