2012-06-06 15 views
5

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.

Respuesta

2

Al digerir varias respuestas diferentes aquí y en cualquier otro lugar, la solución que he adoptado es usar la anotación @Typed con un valor de Object.class en mi bean.Esto significa que sólo será elegible para ser inyectado en los campos que se declaran como esto:

@Inject 
private Object something; 

... que afortunadamente llegar a ser prácticamente inexistente. :-)

1

Lo que me gustaría hacer es forzar de alguna manera la producción de persona casos en los que esta aplicación siempre a través de la ruta productor método.

soldadura de costura has a solution para esto.

no estoy 100% seguro de cómo va a desarrollar con la fusión de la costura 3 y Deltaspike (la página es tan años 90, pero las rocas de contenido :-), pero poniendo de soldadura en la ruta de clases es, sin duda una apuesta segura.

Ah, y hasta donde yo sé, un mecanismo comparable lo hizo en la especificación CDI 1.1.

+0

Básicamente, ¿no se puede forzar excepto con la anotación '@ Typed' en CDI 1.0? –

+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 ...!? –

+0

'@ 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. –

3

Anota tu PersonBean como @Alternative luego usará el método de productor.

Cuestiones relacionadas