tipos float datos convertir conversion java spring casting annotations property-placeholder

java - float - @Value Anotación tipo de conversión a Entero a partir de cadena



convertir int a string java (9)

Estoy tratando de convertir el resultado de un valor en un entero:

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

Lo anterior arroja el 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}"

También probé @Value("(java.lang.Integer)${api.orders.pingFrequency}")

Google no parece decir mucho sobre el tema. Me gustaría tratar siempre con un número entero en lugar de tener que analizar este valor en todos los lugares donde se usa.

Solución

Me doy cuenta de que una solución alternativa puede ser utilizar un método setter para ejecutar la conversión por mí, pero si Spring puede hacerlo, preferiría aprender algo sobre Spring.


En mi caso, el problema fue que mi solicitud POST se envió a la misma url que GET (con get parameters usando "? .. = ..") y que los parámetros tenían el mismo nombre que los parámetros de formulario. Probablemente Spring los está fusionando en una matriz y el análisis arrojó un error.


Estaba buscando la respuesta en internet y encontré lo siguiente

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

Entonces en tu caso podrías intentar con esto

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


Este problema también ocurre cuando tiene 2 recursos con el mismo nombre de archivo; diga "configurations.properties" dentro de 2 jar o ruta de directorio diferentes configurados dentro del classpath. Por ejemplo:

Usted tiene sus "configuraciones.propiedades" en su proceso o aplicación web (frasco, guerra u oreja). Pero otra dependencia (jar) tiene el mismo archivo "configurations.properties" en la misma ruta. Entonces, supongo que Spring no tiene idea (@ _ @?) De dónde obtener la propiedad y simplemente envía el nombre de propiedad declarado dentro de la anotación @Value.


Si desea convertir una propiedad en un entero del archivo de propiedades, hay 2 soluciones que encontré:

Escenario dado: customer.properties contiene customer.id = 100 como un campo y desea acceder a él en el archivo de configuración de primavera como entero . La propiedad customerId se declara como tipo int en Bean Customer

Solución 1:

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

En la línea anterior, el valor de cadena del archivo de propiedades se convierte a tipo int .

solución 2: use alguna otra extensión en lugar de propenies . Por ejemplo: si su nombre de archivo de propiedades es customer.properties, hágalo cliente.details y en el archivo de configuración use el código siguiente

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


Si está utilizando @Configuation, instale debajo del bean estático. Si la @Configutation no estática se crea una instancia muy temprano y los BeanPostProcessors responsables de resolver anotaciones como @Value, @Autowired, etc., no pueden actuar en consecuencia. Consulte here

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


Suponiendo que tiene un archivo de propiedades en su classpath que contiene

api.orders.pingFrequency=4

Intenté dentro de un @Controller

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

Con mi contexto de servlet que contiene:

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

Funcionó perfectamente.

Entonces, o bien su propiedad no es un tipo entero, no tiene el marcador de posición de propiedad configurado correctamente o está utilizando la clave de propiedad incorrecta.

Intenté ejecutar con un valor de propiedad no válido, 4123; . La excepción que obtuve es

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

lo que me hace pensar que el valor de su propiedad es

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


Tenía la misma situación exacta. Fue causado por no tener un PropertySourcesPlaceholderConfigurer en el contexto de Spring, que resuelve los valores contra la anotación @Value dentro de las clases.

Incluye un marcador de posición de propiedad para resolver el problema, no es necesario usar expresiones de primavera para enteros (el archivo de propiedad no tiene que existir si usas ignore-resource-not-found="true" ):

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



cuando use @Value, debe agregar la anotación @PropertySource en Class o especificar el titular de propiedades en el archivo xml de spring. p.ej.

@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

¡esto funciona!

Por supuesto, puede usar la configuración de marcador de posición xml en lugar de la anotación. spring.xml

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