@Value annotatietype casten naar Integer vanuit String

Ik probeer de uitvoer van een waarde naar een geheel getal te casten:

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

Het bovenstaande geeft de fout

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

Ik heb ook @Value("(java.lang.Integer)${api.orders.pingFrequency}")

geprobeerd

Google lijkt niet veel te zeggen over dit onderwerp. Ik wil altijd met een geheel getal te maken hebben in plaats van deze waarde overal te moeten ontleden.

Oplossing

Ik realiseer me dat een tijdelijke oplossing kan zijn om een ​​setter-methode te gebruiken om de conversie voor mij uit te voeren, maar als Spring het kan, wil ik liever iets over Spring leren.


Antwoord 1, autoriteit 100%

Ervan uitgaande dat u een eigenschappenbestand in uw klassenpad heeft dat

. bevat

api.orders.pingFrequency=4

Ik heb het geprobeerd in een @Controller

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

Met mijn servlet-context met daarin:

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

Het werkte perfect.

Dus uw eigenschap is geen geheel getal, u hebt de tijdelijke aanduiding voor de eigenschap niet correct geconfigureerd of u gebruikt de verkeerde eigenschapssleutel.

Ik heb geprobeerd met een ongeldige eigenschapswaarde, 4123;. De uitzondering die ik heb is

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

waardoor ik denk dat de waarde van uw eigendom

. is

api.orders.pingFrequency=(java.lang.Integer)${api.orders.pingFrequency}

Antwoord 2, autoriteit 55%

Ik zocht het antwoord op internet en vond het volgende

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

Dus in jouw geval zou je dit kunnen proberen

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

Antwoord 3, autoriteit 12%

Als u een propertynaar een integeruit het eigenschappenbestand wilt converteren, zijn er 2oplossingen die ik heb gevonden:

Gegeven scenario: customer.propertiesbevat customer.id = 100als een veld en u wilt het openen in het lente-configuratiebestand als integer.De eigenschap customerIdwordt gedeclareerd als type intin de Bean Customer

Oplossing 1:

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

Snippet uitvouwen


Antwoord 4, autoriteit 12%

Ik had precies dezelfde situatie. Het werd veroorzaakt door het niet hebben van een PropertySourcesPlaceholderConfigurerin de Spring-context, die waarden oplost tegen de @Value-annotatie binnen klassen.

Voeg een tijdelijke aanduiding voor een eigenschap toe om het probleem op te lossen, het is niet nodig om Spring-expressies voor gehele getallen te gebruiken (het eigenschappenbestand hoeft niet te bestaan ​​als u ignore-resource-not-found="true"gebruikt ):

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

Antwoord 5, autoriteit 11%

Als je @Configuation gebruikt, start dan onder static bean. Als het niet statisch is, wordt @Configutation heel vroeg geïnstantieerd en kunnen de BeanPostProcessors die verantwoordelijk zijn voor het oplossen van annotaties zoals @Value, @Autowired enz. er niets aan doen. Raadpleeg hier

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

Antwoord 6, autoriteit 2%

Ik had hetzelfde probleem dat ik hiermee heb opgelost. Raadpleeg deze Spring MVC: @Value annotatie om de int-waarde te krijgen die is gedefinieerd in het *.properties-bestand

@Value(#{propertyfileId.propertyName})

werkt


Antwoord 7

Dit probleem doet zich ook voor als u 2 bronnen met dezelfde bestandsnaam hebt; zeg “configurations.properties” binnen 2 verschillende jar- of directorypaden die zijn geconfigureerd in het klassenpad. Bijvoorbeeld:

U heeft uw “configurations.properties” in uw proces of webtoepassing (jar, war of ear). Maar een andere afhankelijkheid (jar) heeft hetzelfde bestand “configurations.properties” in hetzelfde pad. Dan veronderstel ik dat Spring geen idee heeft (@_@?) waar hij de eigenschap kan krijgen en gewoon de naam van de eigenschap stuurt die in de @Value-annotatie wordt vermeld.


Antwoord 8

In mijn geval was het probleem dat mijn POST-verzoek naar dezelfde url als GET werd gestuurd (met get-parameters met “?..=..”) en dat parameters dezelfde naam hadden als formulierparameters. Waarschijnlijk is Spring ze aan het samenvoegen tot een array en was parseren een fout.


Antwoord 9

wanneer u @Value gebruikt, moet u een @PropertySource-annotatie toevoegen aan Class, of de houder van eigenschappen specificeren in het xml-bestand van spring.
bijv.

@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

dit werkt!

Natuurlijk kunt u de placeholder xml-configuratie gebruiken in plaats van annotatie.
spring.xml

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

Antwoord 10

Aangezien het gebruik van de @Value(“new Long(“myconfig”)”)met cast fout kan veroorzakenbij opstartenals de config is niet gevondenof indien niet in hetzelfde verwachte getalformaat

We hebben de volgende aanpak gebruikt en werken zoals verwacht met fail safe check.

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

Other episodes