JSF 2 inserisce il bean / servizio Spring con @ManagedProperty e no xml

Vorrei utilizzare le annotazioni jsf e alcune annotazioni di spring per iniettare un bean / servizio spring in un bean jsf gestito. (sul jsf bean voglio solo usare le annotazioni @named ) Non voglio usare annotazioni come @named / @inject .

Ho provato a trovare una soluzione in rete ma senza fortuna.

Esempio

 @ManagedBean @ViewScoped public class MyBean { @ManagedProperty(value = "#{mySpringBean}") private MySpringBean mySpringBean; public void setMySpringBean(MySpringBean mySpringBean) { this.mySpringBean = mySpringBean; } public void doSomething() { //do something with mySpringBean } } 

È qualcosa di simile ansible senza l’uso di xml. Ad esempio, NON mi piacerebbe usare qualcosa di simile

 FacesContextUtils.getWebApplicationContext(context).getBean("MySpringBean"); 

o in faces-config.xml

  myBean com.mytest.MyBean view  mySpringBean #{mySpringBean}   

Qualcosa di simile a quanto sopra è ansible con annotazioni e senza definire tutti i bean / proprietà jsf e i bean di spring / proprietà per ogni bean nei file config xml?

Se hai già un contenitore Spring, perché non usare la sua annotazione @Autowired. Per questo, aggiorna il tuo faces-config.xml come suggerito da Boni. Quindi aggiungi questi listener al tuo web.xml dopo questo

  contextConfigLocation /WEB-INF/applicationContext.xml   org.springframework.web.context.ContextLoaderListener   org.springframework.web.context.request.RequestContextListener  

Quindi aggiungili al tuo applicationContext.xml

  

Ora puoi usare le annotazioni Spring e il tuo bean sarà qualcosa del genere:

 package com.examples; @Component @Scope(value="request") public class MyBean { @Autowired private MySpringBeanClass mySpringBean; } 

Annota il tuo MySpringBeanClass con @Service

Guarda anche:

  • @Scope (“richiesta”) non funziona

Metti questo codice in your faces-config.xml

   org.springframework.web.jsf.el.SpringBeanFacesELResolver   

Quindi, nella chiamata del Costruttore ManageBean;

 WebApplicationContext ctx = FacesContextUtils.getWebApplicationContext(FacesContext.getCurrentInstance()); mySpringBean = ctx.getBean(MySpringBean.class); 

MySpringBean significa la tua class Spring Bean

Supponendo che tu abbia configurato Spring correttamente in web.xml e applicationContext.xml. Effettuare la seguente voce in faces-config.xml

  org.springframework.web.jsf.el.SpringBeanFacesELResolver  

Il codice di esempio sopra riportato sembra soddisfacente. Quello che succederà con la voce sopra è gestito Proprietà verrà prima guardato in bean gestito da JSF se non trovato sarà cercato in fagioli gestiti da Primavera. Il tuo bean spring dovrebbe avere le annotazioni corrette e il nome dato in @ManagedProperty deve corrispondere al nome predefinito / nome assegnato a bean.

Come menzionato da @Boni che non è richiesto, è autoiniettato. Ho usato le impostazioni come desideri.

Una nota a margine: poiché stai optando per l’ambito di visualizzazione, dai un’occhiata a questo link I vantaggi e le insidie ​​di @ViewScoped