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.

Los registros de Java no están funcionando con la anotación ConfigurationProperties.

Estoy utilizando la anotación @ConfigurationProperties para auto-configurar mis propiedades. Antes mi clase de configuración funcionaba bien, pero intenté lograr lo mismo con registros y simplemente falla.

Seguí esta respuesta de SO, pero en mi caso no funcionó: https://stackoverflow.com/a/68358180/13189473

En mi archivo application.properties hay una propiedad que se llama cache.validity=200.

Este es el código:

@Component
@ConfigurationProperties("cache")
public record MyConfig(int validity) {

@ConstructorBinding
public MyConfig(int validity) {
this.validity= Optional.ofNullable(validity).orElse(0);
}

}

Cuando intento iniciar mi aplicación, obtengo el siguiente error:

Descripción:

El parámetro 0 del constructor en ...MyConfig necesitaba un bean de tipo 'int' que no se pudo encontrar.

El punto de inyección tiene las siguientes anotaciones:
- @org.springframework.beans.factory.annotation.Autowired(required=true)

Acción:

Considere definir un bean de tipo 'int' en su configuración.

¿Cuál es la manera correcta de hacer que esto funcione? Gracias de antemano.

Edición: Mi pom.xml:

    <properties>
        <java.version>17</java.version>
        <spring.boot.version>2.5.4</spring.boot.version>
        <spring.version>5.3.9</spring.version>
    </properties>

Mi application.properties:

server.port=8060
cache.validity=0
... (Controladores de BD/Configuraciones de seguridad)
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema aquí es que estás tratando de usar una clase de registro con la anotación @ConfigurationProperties, pero no está funcionando como esperabas. El mensaje de error indica que no puede encontrar un bean del tipo int.

    Una solución es definir explícitamente el bean MyConfig en una clase de configuración utilizando la anotación @Bean, así:

    @Configuration
    public class MyConfigConfiguration {
    
        @Bean
        @ConfigurationProperties(prefix = "cache")
        public MyConfig myConfig() {
            return new MyConfig();
        }
    }
    

    Y luego modificar el registro MyConfig para eliminar el constructor y utilizar el constructor predeterminado en su lugar:

    @Component
    @ConfigurationProperties("cache")
    public record MyConfig(int validity) {
        public MyConfig() {
        }
    }
    

    Como alternativa, puedes intentar actualizar tus versiones de Spring Boot y Spring a las últimas, ya que este problema puede estar relacionado con versiones antiguas. También puedes intentar agregar la dependencia spring-boot-configuration-processor a tu archivo pom.xml para ver si ayuda con el procesamiento de las propiedades de configuración.

    <dependency>
        <groupid>org.springframework.boot</groupid>
        <artifactid>spring-boot-configuration-processor</artifactid>
        <optional>true</optional>
    </dependency>
    

    Una vez que hayas realizado estos cambios, el bean MyConfig debería ser autoconfigurado correctamente y la propiedad cache.validity debería ser inyectada en él.

Comments are closed.