2011-08-23 13 views
7

Estoy escribiendo un componente (compuesto) que necesita interactuar con mi DAO. Aquí es cómo la parte de Java se declara:Inyectando recursos en UIComponent (¿alias funciona el CDI aquí?)

@FacesComponent(value="selectLocation") 
public class SelectLocation extends UINamingContainer { 

para obtener el objeto DAO, probé la anotación CDI:

@Inject private LocationControl lc; 

Y que no funcionó así que probé las caras anotación:

@ManagedProperty (value = "@{locationControl}") private LocationControl lc; 

Ambos casos no ocurre nada - la propiedad lc termina como nula después de que el constructor finaliza.

Uso CDI en todos mis respaldos y todo funciona. Esto usaría Weld dentro de GlassFish 3.1.1. ¿Alguna sugerencia sobre cómo obtener el recurso?

+0

Dang pensé que estabas en lo cierto allí - me trató java.inject.Named pero todavía no hay alegría. – AlanObject

+0

Agregar un @RequestScoped hace que la aplicación no se pueda implementar: WELD-001437 Clase de bean de ámbito normal javax.faces.component.UIComponent no es proxyable porque el tipo es final o contiene un método final public javax.faces.component final. TransientStateHelper javax.faces.component.UIComponent.getTransientStateHelper(). – AlanObject

+0

El componente creado le permite al usuario seleccionar un objeto de Ubicación navegando a través de una base de datos (JPA) de dichos objetos. Para eso necesito acceder al DAO ya sea directa o indirectamente. Pero mis DAO no son diferentes de mis otros beans administrados por CDI, solo tienen anotaciones JPA dentro de ellos como @PersistenceContext en ellos. Estoy leyendo la especificación CDI ahora para ver si hay algo en beans.xml que pueda ayudar. – AlanObject

Respuesta

5

Tengo un problema por el momento, que es básicamente poner el código de la placa de la caldera que CDI et. Alabama. se supone que debe eliminarse. Ahora tengo este método:

public LocationControl getLocationControl() { 
    if (lc != null) return lc; 
    FacesContext fc = getFacesContext(); 
    Object obj = fc.getApplication().evaluateExpressionGet(fc, "#{locationControl}", LocationControl.class); 
    if (obj instanceof LocationControl) lc = (LocationControl) obj; 
    return lc; 
} 

Me gustaría saber si alguien tiene una mejor solución.

2

No sé si también funciona para los componentes, pero con CDI + MyFaces CODI tienes @Advanced para marcar, p. Oyentes de fase que deberían poder utilizar @Inject. Si no funciona, podría crear una solicitud de función en su JIRA. Son bastante rápidos y hay lanzamientos frecuentes.

O utiliza: MyBean myBean = BeanManagerProvider.getInstance(). GetContextualReference (MyBean.class); manualmente.

2

¿Hay alguna manera de hacer este trabajo sin soluciones?

Sí, simplemente use un bean de respaldo de la manera habitual.

<x:someComponent value="#{someBean.someProperty}" /> 

Wrap si es necesario en un archivos de símbolos reutilizables/composite para mantenerlo seco:

<my:someComponent />