Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

@Value annotation type casting to Integer from String

I'm trying to cast the output of a value to an integer:

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

The above throws the error

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

I've also tried @Value("(java.lang.Integer)${api.orders.pingFrequency}")

Google doesn't appear to say much on the subject. I'd like to always be dealing with an integer instead of having to parse this value everywhere it's used.

Workaround

I realize a workaround may be to use a setter method to run the conversion for me, but if Spring can do it I'd rather learn something about Spring.

like image 838
Webnet Avatar asked Mar 13 '13 19:03

Webnet


People also ask

What does the @value annotation do?

@Value is a Java annotation that is used at the field or method/constructor parameter level and it indicates a default value for the affected argument. It is commonly used for injecting values into configuration variables - which we will show and explain in the next part of the article.

Can I use @value in pojo?

For the record, the specification of what a POJO is, means that the class cannot contain pre-specified annotations. So even in another world where @Value could work on a non-spring bean, it would still, by definition, break the POJO aspect of the class.

What is the use of @value in spring boot?

One of the most important annotations in spring is @Value annotation which is used to assign default values to variables and method arguments. We can read spring environment variables as well as system variables using @Value annotation. It also supports Spring Expression Language (SpEL).


1 Answers

Assuming you have a properties file on your classpath that contains

api.orders.pingFrequency=4 

I tried inside a @Controller

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

With my servlet context containing :

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

It worked perfectly.

So either your property is not an integer type, you don't have the property placeholder configured correctly, or you are using the wrong property key.

I tried running with an invalid property value, 4123;. The exception I got is

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

which makes me think the value of your property is

api.orders.pingFrequency=(java.lang.Integer)${api.orders.pingFrequency} 
like image 71
Sotirios Delimanolis Avatar answered Oct 13 '22 19:10

Sotirios Delimanolis