Saltar al contenido

Codificación UTF-8 de application.properties attributes en Spring-Boot

Luego de mucho luchar pudimos encontrar la contestación de esta pregunta que algunos los usuarios de este espacio presentan. Si tienes algo que aportar no dudes en aportar tu comentario.

Solución:

Como ya se mencionó en los comentarios, se espera que los archivos .properties estén codificados en ISO 8859-1. Se pueden usar escapes Unicode para especificar otros caracteres. También hay una herramienta disponible para hacer la conversión. Esto se puede usar, por ejemplo, en la compilación automática para que aún pueda usar su codificación favorita en la fuente.

Por favor, intente agregar PropertySource anotación con parámetro de codificación en su archivo de configuración:

@PropertySource(value = "classpath:application-$env.properties", encoding = "UTF-8")

Espero eso ayude.

Me he enfrentado al mismo problema. En Spring Boot hay 2 PropertySourceLoader que se usan para cargar propiedades en la aplicación:

  • PropiedadesPropiedadFuenteCargador – admite UTF-8 solo cuando se carga desde XML
  • YamlPropertySourceLoader – admite UTF-8, pero debe cambiar el formato de configuración para usarlo

Se enumeran en el archivo https://github.com/spring-projects/spring-boot/blob/master/spring-boot/src/main/resources/META-INF/spring.factories

Así que decidimos escribir nuestra propia implementación de PropertySourceLoader que podría cargar correctamente las propiedades del archivo UTF-8. La idea es de la respuesta @BalusC – Cómo usar UTF-8 en propiedades de recursos con ResourceBundle

Nuestra implementación de PropertySourceLoader:

public class UnicodePropertiesPropertySourceLoader implements PropertySourceLoader 

@Override
public String[] getFileExtensions() 
    return new String[]"properties";


@Override
public PropertySource load(String name, Resource resource, String profile) throws IOException 
    if (profile == null) 
        Properties properties = new Properties();
        PropertyResourceBundle bundle = new PropertyResourceBundle(new InputStreamReader(resource.getInputStream(), "UTF-8"));
        Enumeration keys = bundle.getKeys();
        while (keys.hasMoreElements()) 
            String key = keys.nextElement();
            properties.setProperty(key, bundle.getString(key));
        
        if (!properties.isEmpty()) 
            return new PropertiesPropertySource(name, properties);
        
    
    return null;



Luego creamos el archivo recursos/META-INF/spring.factories con contenido:

# Custom PropertySource Loaders
org.springframework.boot.env.PropertySourceLoader=
your.own.package.UnicodePropertiesPropertySourceLoader

Ahora tenemos 3 PropertySourceLoader en nuestra aplicación en el siguiente orden:

  • UnicodePropertiesPropertySourceLoader
  • PropiedadesPropiedadFuenteCargador
  • YamlPropertySourceLoader

¡NOTAS!

  1. No estoy seguro de que sea un uso adecuado de PropertyResourceBundle
  2. No estoy seguro de que el orden de PropertySourceLoaders en Spring Boot sea el mismo si crea una biblioteca dedicada para reutilizarla en otros proyectos.

En nuestro proyecto esta solución funciona bien.

¡ACTUALIZAR!

Es mejor implementar el método de carga de UnicodePropertiesPropertySourceLoader sin PropertyResourceBundle:

@Override
public PropertySource load(String name, Resource resource, String profile) throws IOException 
    if (profile == null) 
        Properties properties = new Properties();
        properties.load(new InputStreamReader(resource.getInputStream(), "UTF-8"));
        if (!properties.isEmpty()) 
            return new PropertiesPropertySource(name, properties);
        
    
    return null;

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *