web-dev-qa-db-de.com

Annotationstyp @Value von String in Integer umgewandelt

Ich versuche, die Ausgabe eines Werts in eine Ganzzahl umzuwandeln:

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

Das obige wirft 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 auch @Value("(Java.lang.Integer)${api.orders.pingFrequency}") ausprobiert

Google scheint nicht viel zu diesem Thema zu sagen. Ich möchte mich immer mit einer ganzen Zahl beschäftigen, anstatt diesen Wert überall analysieren zu müssen.

Problemumgehung

Ich erkenne, dass eine Problemumgehung darin besteht, eine Setter-Methode zu verwenden, um die Konvertierung für mich auszuführen, aber wenn Spring es kann, lerne ich etwas über Spring.

41
Webnet

Angenommen, Sie haben eine Eigenschaftendatei in Ihrem Klassenpfad, die enthält 

api.orders.pingFrequency=4

Ich habe in einem @Controller versucht

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

In meinem Servlet-Kontext enthalten:

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

Es hat perfekt funktioniert. 

Entweder ist Ihre Eigenschaft keine Ganzzahl, der Platzhalter für Eigenschaften ist nicht ordnungsgemäß konfiguriert, oder Sie verwenden den falschen Eigenschaftsschlüssel.

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

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

das lässt mich denken, der Wert Ihrer Immobilie ist 

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

Ich habe im Internet nach der Antwort gesucht und folgendes gefunden

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

In Ihrem Fall könnten Sie es also versuchen

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

Wenn Sie ein Eigenschaft in ein Ganzzahl aus einer Eigenschaftendatei konvertieren möchten, gibt es 2 Lösungen, die ich gefunden habe:

Gegebenes Szenario: customer.properties enthält customer.id = 1 als Feld und Sie möchten im Frühjahr als integer auf die Konfigurationsdatei zugreifen Die Eigenschaft customerId wird als Typ int in der Bean Customer deklariert

Lösung 1:

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

In der obigen Zeile wird der Wert string aus der Eigenschaftendatei in int Typ konvertiert.

lösung 2: Verwenden Sie eine andere Erweiterung anstelle von Eigenschaften. Beispiel: Wenn der Name Ihrer Eigenschaftendatei Kunden.Eigenschaften lautet, geben Sie Kunden.Details ein = und in der Konfigurationsdatei den folgenden Code verwenden

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

Ich hatte genau die gleiche Situation. Es wurde durch einen PropertySourcesPlaceholderConfigurer im Spring-Kontext verursacht, der Werte gegen die @Value-Annotation innerhalb von Klassen auflöst.

Fügen Sie einen Eigenschaftsplatzhalter ein, um das Problem zu lösen. Sie müssen keine Spring-Ausdrücke für Ganzzahlen verwenden (die Eigenschaftendatei muss nicht vorhanden sein, wenn Sie ignore-resource-not-found="true" verwenden):

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

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

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

Ich hatte das gleiche Problem, das ich damit gelöst habe. Verweisen Sie auf diese Spring-MVC: @Value-Annotation, um den in der * .properties-Datei definierten int-Wert zu erhalten.

@Value(#{propertyfileId.propertyName})

funktioniert

1
Saurabh

wenn Sie @Value verwenden, sollten Sie die @PropertySource-Annotation zu Class hinzufügen oder den Eigenschafteninhaber in der xml-Datei von Spring ..__ angeben.

@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

das funktioniert!

Natürlich können Sie anstelle der Annotation . Spring.xml die XML-Konfiguration für Platzhalter verwenden

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

In meinem Fall bestand das Problem darin, dass meine POST - Anforderung an dieselbe URL gesendet wurde wie GET (mit get-Parametern, die "? .. = .." verwenden) und dass diese Parameter denselben Namen wie die Formularparameter hatten. Wahrscheinlich fügt Spring sie in einem Array zusammen und das Parsen warf einen Fehler.

0
Krystian

Dieses Problem tritt auch auf, wenn Sie über 2 Ressourcen mit demselben Dateinamen verfügen. Sagen Sie "changes.properties" innerhalb von 2 verschiedenen JAR- oder Verzeichnispfaden, die innerhalb des Klassenpfads konfiguriert sind. Zum Beispiel:

In Ihrem Prozess oder Ihrer Webanwendung (Glas, Krieg oder Ohr) befinden sich Ihre "Konfigurationen.Eigenschaften". Eine andere Abhängigkeit (jar) hat jedoch die gleiche Datei "configuration.properties" im selben Pfad. Dann nehme ich an, dass Spring keine Ahnung hat (@ _ @?), Wo die Eigenschaft abgerufen werden soll, und der in der @ Value-Annotation deklarierte Eigenschaftenname nur gesendet wird.

0