javaspringcastingannotationsproperty-placeholder

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


Solution

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