2013-03-13 21 views
34

Ich versuche, die Ausgabe eines Wertes auf eine ganze Zahl würfen auch@Value Anmerkung Typ Integer von String Casting

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

Die oben führt den Fehler

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

Ich habe versucht

Google scheint nicht viel zu dem Thema zu sagen. Ich möchte immer mit einer Ganzzahl arbeiten, anstatt diesen Wert überall dort analysieren zu müssen, wo er verwendet wird.

Umgehung

ich eine Abhilfe realisieren kann, um eine Setter-Methode verwenden, um die Umwandlung für mich zu laufen, aber wenn Frühling kann es tun würde ich lieber etwas über Spring lernen.

+0

Ist die Ausnahme für den ersten Versuch oder die zweite? –

+0

@SotiriosDelimanolis Die erste – Webnet

+0

Wenn Sie jemals auf ein solches Problem stoßen, ist es am offensichtlichsten, dass Sie vergessen haben, die richtige PropertySource zu definieren.Sie benötigen: @Bean public static PropertySourcesPlaceholderConfigurator propertySourcesPlaceholderConfigurer() { Rückgabe neuer PropertySourcesPlaceholderConfigurer(); } – Dudelilama

Antwort

28

Sie haben eine Eigenschaftendatei auf Ihrem Classpath davon aus, dass enthält

api.orders.pingFrequency=4 

habe ich versucht, in einem @Controller

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

Mit meinem Servlet-Kontext enthält:

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

Es funktionierte perfekt.

Ihre Eigenschaft ist also kein Integer-Typ, Sie haben den Eigenschaftenplatzhalter nicht korrekt konfiguriert oder Sie verwenden den falschen Eigenschaftsschlüssel.

Ich habe versucht, mit einem ungültigen Eigenschaftswert 4123; ausgeführt. Die Ausnahme, die ich bekam ist

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

, die mir den Wert Ihrer Immobilie macht denken ist

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

Ich war für die Antwort im Internet suchen und ich fand die folgende

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

in Ihrem Fall So könnte man mit diesem versuchen

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

Dies gibt mir SpelEvaluationException. Bist du sicher, dass es funktioniert? –

+0

Ich bekomme auch SpelEvaluationException – userRaj

+1

Statt 'neue Integer.parseInt' mit 'New Integer' arbeitete für mich. – userRaj

7

Wenn Sie eine Eigenschaft zu einer integer von Eigenschaften dort Datei konvertieren möchten sind Lösungen, die ich gefunden habe:

Gegebenes Szenario: customer.properties enthält customer.id = 100 als ein Feld, und Sie möchten in der Frühlings-Konfigurationsdatei als Integer zugreifen.Die Eigenschaft customerId wird als Typ deklariert int in der Bean Kunden

Lösung 1:

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

In der oberen Zeile, die Zeichenfolge Wert von Eigenschaften Datei wird in Int Typ konvertiert.

Lösung 2: Verwenden Sie eine andere Erweiterung Inplace von propeties .Für Ex.- Wenn Ihre Eigenschaften Dateiname ist customer.properties es dann customer.details machen und in der Konfigurationsdatei verwenden den Code unten

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

6

hatte ich genau die gleiche Situation. Es wurde verursacht, indem kein PropertySourcesPlaceholderConfigurer im Spring-Kontext, der Werte gegen die @Value Annotation in Klassen löst.

eine Eigenschaft Platzhalter Fügen Sie das Problem zu lösen, keine Notwendigkeit, Frühling Ausdrücke für ganze Zahlen verwenden (die Eigenschaftendatei muss nicht vorhanden sein, wenn Sie ignore-resource-not-found="true" verwenden): I

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

Dieses Problem tritt auch funktioniert, wenn Sie zwei Ressourcen mit dem gleichen Dateinamen haben; Sagen Sie "configurations.properties" innerhalb von 2 verschiedenen jar- oder Verzeichnispfaden, die im Klassenpfad konfiguriert sind. Zum Beispiel:

Sie haben Ihre "configurations.properties" in Ihrer Prozess- oder Webanwendung (Jar, War oder Ear). Aber eine andere Abhängigkeit (jar) hat dieselbe Datei "configurations.properties" im selben Pfad. Dann nehme ich an, dass Spring keine Ahnung hat (@ _ @?), Woher die Eigenschaft kommt und sendet nur den Eigenschaftsnamen, der in der Annotation @Value deklariert ist.

0

In meinem Fall war das Problem, dass meine POST-Anfrage an die gleiche URL wie GET gesendet wurde (mit Get-Parameter mit "? .. = ..") und dass Parameter denselben Namen wie Formularparameter hatten. Vermutlich fasst Spring sie zu einem Array zusammen, und Parsing war ein Fehler.

0

Wenn Sie @Configuation verwenden, instanziieren Sie unterhalb der statischen Bean. Wenn nicht statisch, wird @Configuration sehr früh instanziiert und die BeanPostProcessors, die für das Auflösen von Annotationen wie @Value, @Autowired usw. zuständig sind, können nicht darauf reagieren. Siehe here

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