es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Refrescar el ámbito de Spring con evaluación diferida de SpEL.

Estoy teniendo problemas para saber cómo es posible esto o una posible solución/alternativa de trabajo. Estoy buscando configurar variables que están en forma de “foo, bar, baz” en un List como elementos separados. Actualmente, el código se ve así:

@RefreshScope
@Configuration
@Getter
public class fakeConfiguration {
    @Value("#{PropertySplitter.toSet('${properties:}')}")
    private final Set<string> field = new HashSet<>();
}

@Component("PropertySplitter")
@SuppressWarnings("unused")
public class PropertySplitter {
    public Set<string> toSet(String property) {
        Set<string> set = new HashSet<>();

    if (!property.trim().isEmpty()) {
        Collections.addAll(set, property.split("\\s*,\\s*"));
    }

    return set;
}
}

Esto evalúa correctamente la lista de cadenas en un conjunto, pero el refreshScope nunca se activa correctamente. Si uso:

@Value("${properties:}")
private final String fieldAsString;

Puedo ver que el campo se actualiza correctamente, pero me gustaría convertir activamente el valor en una lista a medida que cambia. ¿Es esto posible?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Es posible convertir una cadena separada por comas en una lista de cadenas utilizando el ConversionService de Spring. Primero, necesitas crear una clase Converter que convierta la cadena en una lista de cadenas:

    import org.springframework.core.convert.converter.Converter;
    import org.springframework.stereotype.Component;
    
    import java.util.Arrays;
    import java.util.List;
    
    @Component
    public class StringToListConverter implements Converter<string,></string,><string>> {
    
        @Override
        public List<string> convert(String source) {
            return Arrays.asList(source.split(","));
        }
    }
    

    Luego, debes configurar el ConversionService en el contexto de tu aplicación:

    import org.springframework.context.annotation.Configuration;
    import org.springframework.format.FormatterRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    
    @Configuration
    public class WebConfig implements WebMvcConfigurer {
    
        private final StringToListConverter stringToListConverter;
    
        public WebConfig(StringToListConverter stringToListConverter) {
            this.stringToListConverter = stringToListConverter;
        }
    
        @Override
        public void addFormatters(FormatterRegistry registry) {
            registry.addConverter(stringToListConverter);
        }
    }
    

    Finalmente, puedes usar la anotación @Value para inyectar la lista de cadenas en tu clase de configuración:

    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    
    import java.util.List;
    
    @Component
    public class MyConfig {
    
        private final List<string> properties;
    
        public MyConfig(@Value("${properties:}") List<string> properties) {
            this.properties = properties;
        }
    
        // ...
    }
    

    Esto actualizará automáticamente la lista de cadenas cada vez que cambie el valor de properties.

Comments are closed.