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.

CadaPropiedad en el método de fábrica con ConfigurationInject.

Intentando inyectar múltiples instancias únicas de ThirdPartyClass mediante @EachProperty.

Dado que no soy el propietario de ThirdPartyClass, estoy utilizando @Factory para este propósito, de la siguiente manera:

@Factory
public class ThirdPartyClassFactory {
    @EachProperty("xyz")
    @ConfigurationInject
    public ThirdPartyClass thirdPartyClass(int a) {
        return new ThirdPartyClass(a);
    }
}

Y la configuración:

xyz:
  default:
    a: 5
  another:
    a: 9

Pero al ejecutar esto, obtengo el siguiente mensaje:

Error al inyectar el valor para el parámetro [a] del método [thirdPartyClass]
No existe un bean de tipo [int]. Asegúrese de que el bean ...

Sin embargo, si yo fuera el propietario de ThirdPartyClass, el siguiente enfoque funcionaría bien:

@EachProperty("xyz")
public class ThirdPartyClass {
    @ConfigurationInject
    public ThirdPartyClass(int a) {
    }
}

Ten en cuenta que no se trata de que @EachProperty no funcione en los métodos de fábrica en absoluto, simplemente no pude hacer que inyecte propiedades como lo haría con @EachProperty en la definición de la clase.

¿Alguien podría arrojar luz sobre esto? Probablemente solo me esté perdiendo alguna parte de la documentación.

Tags:  

Answer

  1. Avatar for davy.ai

    Solución para inyectar múltiples singletons de ThirdPartyClass a través de @EachProperty

    Cuando intentas inyectar múltiples singletons de ThirdPartyClass a través de @EachProperty, no puedes usar la anotación @ConfigurationInject en el método de fábrica, como se muestra en el siguiente fragmento de código:

    @Factory
    public class ThirdPartyClassFactory {
    
        @EachProperty("xyz")
        @ConfigurationInject
        public ThirdPartyClass thirdPartyClass(int a) {
            return new ThirdPartyClass(a);
        }
    }
    

    Esto se debe a que @ConfigurationInject se utiliza para inyectar propiedades de configuración en instancias de beans administrados por Micronaut, y no para inyectar propiedades en métodos de fábrica.

    Para solucionar este problema, puedes utilizar la anotación @Value para inyectar la propiedad de configuración, como se muestra a continuación:

    @Factory
    public class ThirdPartyClassFactory {
    
        @EachProperty("xyz")
        public ThirdPartyClass thirdPartyClass(@Value("${xyz.${property}.a}") int a) {
            return new ThirdPartyClass(a);
        }
    }
    

    En el código anterior, la anotación @Value se utiliza para inyectar la propiedad de configuración ${xyz.${property}.a} en el método thirdPartyClass. El marcador de posición ${property} se resuelve al nombre de la propiedad actual que está siendo procesada por @EachProperty.

    Con este enfoque, Micronaut resuelve el valor de configuración en tiempo de ejecución e lo inyecta en el parámetro del método.

    ¡Espero que esto te ayude!

Comments are closed.