Parte de mi problema aquí es utilizar el vocabulario adecuado, por lo que me disculpo de antemano por lo que podría ser una simple cuestión de terminología.¿Cómo forzo el uso de un método de productor de CDI?
Supongamos que tengo una interfaz Person
y una clase PersonBean
que implementa esa interfaz.
Supongamos además que tengo un método de productor en alguna parte (anotado @Produces
) que devuelve Person
. Internamente, devuelve un nuevo PersonBean
, pero eso no es ni aquí ni allí.
Por último, supongamos que tengo otra CDI frijol en algún lugar con un punto de inyección se define así:
@Inject
private Person person;
Suponiendo que tengo todos mis archivos en lugar beans.xml
etc., y he bootstrap de soldadura u otro CDI-1.0-compatible entorno, ya que todo esto vale, tendré un error de definición ambiguo. Esto tiene sentido: Weld encontrará mi PersonBean
como candidato a inyección (podría simplemente llamar al constructor) y encontrará la salida de mi método de productor como candidato a inyección.
Lo que me gustaría hacer es de alguna manera forzar la producción de instancias Person
en esta aplicación para enrutar siempre el método de productor.
Entiendo que podría inventar algún calificador en algún lugar y hacer que el método de productor produzca instancias Person
calificadas por ese calificador. Si hago eso, y cambio mi punto de inyección para incluir el calificador, entonces obviamente solo hay una fuente de estos inyectables calificados (es decir, el método de mi productor), entonces voila, problema resuelto.
Pero supongamos que no quiero inventar un calificador falso. (No estoy diciendo que este sea el caso, solo trato de entender más profundamente los problemas.) ¿Cuáles son mis opciones? ¿Tengo alguno? Supongo que podría poner @Typed(Object.class)
en el PersonBean
para hacerlo de manera que no fue visto como un Person
por CDI ....
Cualquier idea bienvenida, incluyendo enlaces a documentación, o mejores maneras de entender esto. Gracias.
Básicamente, ¿no se puede forzar excepto con la anotación '@ Typed' en CDI 1.0? –
No estoy seguro de entender tu comentario. Puede forzar la producción de forma independiente usando '@ Unwraps' de Solder. Y no hay '' Typed' en CDI ...!? –
'@ Typed': http://docs.oracle.com/javaee/6/api/javax/enterprise/inject/Typed.html En pocas palabras, regula los tipos de frijoles que su bean expone a las entrañas del CDI. Sería una forma de decirle a la maquinaria de CDI que mantenga sus manos alejadas de su objeto y permita que su método de productor lo haga una instancia directamente. Mi caso de uso es crear una instancia 'Logger' (¡no constructor no-arg!) Para que pueda controlar el tipo de' LogRecord' que crea cuando se registra. –