2011-08-23 12 views
7

Sto scrivendo un componente (composito) che deve interagire con il mio DAO. Ecco come la parte Java è dichiarato:Iniettare le risorse in UIComponent (ovvero il CDI funziona qui?)

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

per ottenere l'oggetto DAO, ho provato l'annotazione CDI:

@Inject private LocationControl lc; 

E che non ha funzionato così ho provato il Volti della nota:

In entrambi i casi non accade nulla - la proprietà lc finisce come nulla dopo che il costruttore ha terminato.

Uso CDI in tutti i miei backing bean e tutto funziona. Questo userebbe Weld all'interno di GlassFish 3.1.1. Qualche suggerimento su come ottenere la risorsa?

+0

Dang Pensavo che fossi su qualcosa c'è - ho provato java.inject.Named ma ancora nessuna gioia. – AlanObject

+0

L'aggiunta di un @RequestScoped causa l'impossibilità di distribuire l'applicazione: WELD-001437 La classe di bean con ambito normale javax.faces.component.UIComponent non è proxyable perché il tipo è finale o contiene un metodo finale public javax.faces.component. TransientStateHelper javax.faces.component.UIComponent.getTransientStateHelper(). – AlanObject

+0

Il componente creato consente all'utente di selezionare un oggetto posizione sfogliando un database (JPA) di tali oggetti. Per questo ho bisogno di accedere al DAO direttamente o indirettamente. Ma i miei DAO non sono diversi dagli altri miei bean gestiti da CDI: hanno solo annotazioni JPA al loro interno come @PersistenceContext. Sto leggendo le specifiche CDI ora per vedere se c'è qualcosa in bean.xml che può aiutare. – AlanObject

risposta

5

Ho una soluzione per ora, che è fondamentalmente inserire il codice piastra della caldaia che CDI et. al. dovrebbe farla finita. Ora ho questo metodo:

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; 
} 

Mi piacerebbe sapere se qualcuno ha una soluzione migliore.

2

Non so se funziona anche per i componenti, ma con CDI + MyFaces CODI hai @Advanced per contrassegnare per es. Ascoltatori di fase che dovrebbero essere in grado di usare @Inject. Se non funziona, puoi creare una richiesta di funzionalità nella loro JIRA. Sono piuttosto veloci e ci sono rilasci frequenti.

Oppure si utilizza: MyBean myBean = BeanManagerProvider.getInstance(). GetContextualReference (MyBean.class); manualmente.

2

C'è un modo per fare questo lavoro senza soluzioni alternative?

Sì, utilizzare solo un backing bean nel modo consueto.

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

Wrap, se necessario, in un tagfile riutilizzabile/composito per tenerlo asciutto:

<my:someComponent /> 
Problemi correlati