it-swarm.com.ru

Приведение типа аннотации @Value в целое число из строки

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

@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.

41
Webnet

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

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}
37
Sotirios Delimanolis

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

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

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

@Value("#{new Integer.parseInt('${api.orders.pingFrequency}')}")
private Integer pingFrequency;
18
Piero Divasto

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

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

Решение 1:

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

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

решение 2: Используйте другое расширение вместо свойства . Например, если ваше имя файла свойств customer.properties затем сделайте это customer.details и в файле конфигурации используйте следующий код

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

7
ajay

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

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

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

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

@Bean
public static PropertySourcesPlaceholderConfigurer propertyConfigurer() {
   return new PropertySourcesPlaceholderConfigurer();
}
1
V N

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

@Value(#{propertyfileId.propertyName})

работает

1
Saurabh

при использовании @Value вы должны добавить аннотацию @PropertySource для Class или указать держатель свойств в 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 вместо аннотации . Spring.xml

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

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

0
Krystian

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

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

0
Gabriel Villacis