@ Value 注释类型从 String 强制转换为 Integer

我试图将一个值的输出转换为一个整数:

@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}")

谷歌似乎在这个问题上没有说太多。我希望总是处理一个整数,而不是在使用它的任何地方解析这个值。

解决办法

我意识到一个变通方法可能是使用 setter 方法为我运行转换,但如果 Spring 可以做到这一点,我宁愿学习一些关于 Spring 的知识。

162554 次浏览

我在网上寻找答案,发现了以下内容

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

所以你可以试试这个

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

假设类路径上有一个属性文件,其中包含

api.orders.pingFrequency=4

我在 @Controller里面试过了

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

我的 servlet 上下文包含:

<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解决方案:

给定场景: 顾客,财产包含 Id = 100作为字段,您希望在 Spring 配置文件中以 整数. 属性 CustomerId在 Bean 顾客中声明为类型 Int

解决方案1:

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

In the above line, the string value from properties file is converted to int type.

solution 2: Use some other extension inplace of propeties.For Ex.- If your properties file name is customer.properties then make it customer.details and in the configuration file use the below code

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

我也遇到过同样的情况。它是由于在 Spring 上下文中没有 PropertySourcesPlaceholderConfigrer而造成的,后者解析类中针对 @Value注释的值。

包含一个属性占位符来解决问题,不需要对整数使用 Spring 表达式(如果使用 ignore-resource-not-found="true",属性文件不必存在) :

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

我有同样的问题,我解决了使用这个。参考这个 Spring MVC:@Value 注释,以获取 * . properties 文件中定义的 int 值

@Value(#{propertyfileId.propertyName})

工程

当您有2个具有相同文件名的资源时,也会发生这个问题; 在类路径中配置的2个不同的 jar 或目录路径中说“ configations.properties”。例如:

在您的流程或 Web 应用程序(jar、 war 或 ear)中有您的“ configations.properties”。但是另一个依赖项(jar)在相同的路径中有相同的文件“ configations.properties”。那么我想春天一定不知道(@_@?)在哪里获取属性,并只发送在@Value 注释中声明的属性名称。

在我的例子中,问题是我的 POST 请求被发送到与 GET 相同的 URL (使用“ ?..=..")参数的名称与表单参数的名称相同。可能 Spring 正在将它们合并到一个数组中,解析抛出了错误。

如果您使用的是@Configuration,那么在 static bean 下面实例化。如果不是 static@Configution 很早就被实例化了,而且负责解析@Value、@Autowired 等注释的 BeanPostProcessor 无法对其进行操作。请参阅 给你

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

使用@Value 时,应该在 Class 上添加@PropertySource 注释,或者在 spring 的 xml 文件中指定 properties holder。 例如。

@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;
}

Properties

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

成功了!

当然,您可以使用占位符 xml 配置而不是注释。 Xml

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

由于使用的 @ Value (“ new Long (“ myconfig”)”)与铸造可以 投掷错误启动如果 未找到 config或如果不在相同的预期 数字格式

我们使用了以下方法,并按照预期进行故障安全检查。

@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;
}
}