Подтвердить что ты не робот

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

4b9b3361

Ответ 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" />

Ответ 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();
}