web-dev-qa-db-fra.com

@Value diffusion du type d'annotation en Integer à partir de String

J'essaie de convertir le résultat d'une valeur en un entier:

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

Le ci-dessus lève l'erreur 

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

J'ai aussi essayé @Value("(Java.lang.Integer)${api.orders.pingFrequency}")

Google ne semble pas en dire beaucoup sur le sujet. J'aimerais toujours avoir affaire à un entier au lieu de devoir analyser cette valeur partout où elle est utilisée.

Solution de contournement

Je sais qu'une solution de contournement consiste peut-être à utiliser une méthode de définition pour exécuter la conversion, mais si Spring peut le faire, je préfère en apprendre davantage sur Spring.

41
Webnet

En supposant que vous ayez un fichier de propriétés sur votre chemin de classe qui contient 

api.orders.pingFrequency=4

J'ai essayé à l'intérieur d'un @Controller

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

Avec mon contexte de servlet contenant:

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

Cela a fonctionné parfaitement. 

Ainsi, soit votre propriété n'est pas un type entier, vous n'avez pas configuré l'espace réservé de propriété correctement ou vous utilisez une clé de propriété incorrecte.

J'ai essayé de courir avec une valeur de propriété invalide, 4123;. L'exception que j'ai 

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

ce qui me fait penser que la valeur de votre propriété est 

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

Je cherchais la réponse sur Internet et j'ai trouvé ce qui suit

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

Donc, dans votre cas, vous pouvez essayer avec cette

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

J'ai eu exactement la même situation. Cela était dû à l'absence de PropertySourcesPlaceholderConfigurer dans le contexte Spring, qui résout les valeurs en fonction de l'annotation @Value à l'intérieur des classes.

Incluez un espace réservé de propriété pour résoudre le problème, inutile d'utiliser les expressions Spring pour les entiers (le fichier de propriété n'a pas besoin d'exister si vous utilisez ignore-resource-not-found="true"):

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

Si vous utilisez @Configuation, instanciez le bean statique ci-dessous. Si ce n'est pas le cas, @Configutation est instanciée très tôt et les processeurs BeanPostProcessors chargés de résoudre les annotations telles que @Value, @Autowired, etc. ne peuvent pas agir. Reportez-vous ici

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

J'ai eu le même problème que j'ai résolu en utilisant cela. Reportez-vous à cette Spring MVC: @Value annotation pour obtenir la valeur int définie dans le fichier * .properties

@Value(#{propertyfileId.propertyName})

travaux

1
Saurabh

lorsque vous utilisez @Value, vous devez ajouter une annotation @PropertySource sur Class ou spécifier le détenteur des propriétés dans le fichier xml de spring .

@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

cela marche!

Bien sûr, vous pouvez utiliser la configuration XML d'espace réservé au lieu de l'annotation . Spring.xml

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

Dans mon cas, le problème était que ma demande POST avait été envoyée à la même URL que GET (avec les paramètres get utilisant "? .. = ..") et que les paramètres avaient le même nom que les paramètres de formulaire. Probablement, Spring les fusionne dans un tableau et l'analyse a généré une erreur.

0
Krystian

Ce problème se produit également lorsque vous disposez de 2 ressources portant le même nom de fichier. dites "configurations.properties" dans 2 jar ou chemin de répertoire différents configurés dans le chemin d'accès aux classes. Par exemple:

Vous avez vos "configurations.properties" dans votre processus ou votre application Web (jar, war ou ear). Mais une autre dépendance (jar) a le même fichier "configurations.properties" dans le même chemin. Ensuite, je suppose que Spring n'a aucune idée (@ _ @?) Où obtenir la propriété et envoie simplement le nom de la propriété déclaré dans l'annotation @Value.

0
Gabriel Villacis