2011-02-21 1 views
7

Sto provando a @javax.naming.Inject un bean Spring 3 chiamato WtvrBean in un JSF 2 @FacesConverter.Come iniettare un bean Spring 3 in un convertitore JSF 2

Sia il bean che il convertitore sono sullo stesso pacchetto. E, in applicationContext.xml di mia primavera, io sono la scansione di questo pacchetto:

<context:component-scan base-package="my-package" /> 

Ma questo non sta funzionando. Di sicuro, la classe interna JSF 2 che utilizza il convertitore è sicuramente non in my-package.

Ad esempio, se rimuovere il @ManagedBean da un JSF 2 ManagedBean, e sostituirlo a @org.springframework.stereotype.Component o @Controller, il WtvrBean può essere @Inject ed in questo ManagedBean base Spring WebFlow.

Bene, per quanto ne so, non esiste uno stereotipo @Converter in primavera.

So che posso usare

FacesContextUtils.getWebApplicationContext(context).getBean("WtvrBean") 

Ma, con questo approccio, l'accoppiamento tra la web app e la molla è sempre più stretto. (le annotazioni sono metadati e non sono nemmeno considerate dipendenza da alcuni autori).

Attualmente sto utilizzando FacesContextUtils se non esiste una soluzione migliore.

Qualche idea?

risposta

12

Se si vuole iniettare fagioli in istanze di una classe, questi casi devono essere gestiti primavera. Cioè la primavera deve istanziarli. E questo non sta succedendo, quindi - no, non puoi iniettare lì.

Questo perché si registra il convertitore in jsf. È possibile saltare che:

@Component("myConverter") 
public class MyConverter implements Converter { .. } 

E poi, se si utilizza la molla <el-resolver>:

converter="#{myConverter}" 

In modo che lo farà. Ha funzionato per me.

(Una soluzione degno di nota è che è possibile farlo utilizzando aspectj weaving and @Configurable, ma io preferirei il tuo approccio FacesContextUtils. La tessitura modifica classi in modo che diventino la primavera è riuscito anche se non vengono istanziati entro la primavera.)

+0

Ciao. Non voglio che il mio convertitore sia idoneo per l'iniezione. C'è un bean chiamato WtvrBean, e voglio che il bean venga iniettato nel convertitore. Daremo un'occhiata a aspectj. – bluefoot

+0

@bluefoot scusa, questo è quello che intendevo dire - non è possibile iniettare altri fagioli in esso. – Bozho

+0

@bluefoot - oops, ho dimenticato che in realtà l'ho fatto .. vedi il mio aggiornamento – Bozho

-1

Aggiungi annotazione @Scope (ad es. Con parametro "richiesta") al bean gestito.

@ManagedBean 
@Scope("request") 
public class MyBean { 
.... 
} 
+0

che non era quello che ho chiesto. Il mio Managed Bean è ok, proprio come ho scritto. Il problema è nel convertitore. – bluefoot

2
@FacesConverter(value = "examTypeConverter") 
@Named 

Risposta semplice.

+1

Un enorme -1: OP utilizza Spring, non CDI. '@ Named' è specifico per CDI, non Spring. Il modo Spring è -come ha risposto Bozho- usando '@ Component', che in pratica è lo stesso di quello che hai detto tu. Chi ha messo su questa risposta ha dovuto riconsiderare la sua revoca. – BalusC

+0

Spring 3 supporta l'iniezione '@ Named', sebbene non stia chiamando il contenitore CDI per iniettare il bean/risorsa. –

0

hey stavo affrontando lo stesso problema che i bean a molla non vengono iniettati nel convertitore JSF.

quindi, su google, ho trovato le risposte che dopo JSF 2.2 possiamo convertire i convertitori come bean gestito da jsf. e quindi possiamo iniettare la dipendenza dalla molla. ha risolto il mio problema.

@ManagedBean 
@RequestScoped 
public class CustomerByName implements Converter { 

     @ManagedProperty(value = "#{customerDao}") 
     private CustomerDao customerDao; 

e nella tua pagina JSF utilizzarlo come un bean gestito

converter="#{customerByName}"