2012-01-19 14 views
14

Desidero utilizzare le annotazioni jsf e alcune note di primavera per iniettare un bean/servizio spring in un bean jsf gestito. (sul jsf bean voglio solo usare le annotazioni jsf) Non voglio usare annotazioni come @named/@inject.JSF 2 inject bean Spring/service con @ManagedProperty e no xml

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 possibile senza l'uso di XML. Ad esempio, non vorrei usare qualcosa come

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

o in faces-config.xml

<managed-bean> 
    <managed-bean-name>myBean</managed-bean-name> 
    <managed-bean-class>com.mytest.MyBean</managed-bean-class> 
    <managed-bean-scope>view</managed-bean-scope> 
    <managed-property> 
     <property-name>mySpringBean</property-name> 
     <value>#{mySpringBean}</value> 
    </managed-property> 
</managed-bean> 

è qualcosa di simile sopra possibile con le annotazioni e senza definire tutti i fagioli JSF/proprietà e la molla fagioli/proprietà per ogni bean nei file config xml?

+0

divertente, ho utilizzare questo metodo di iniezione e funziona per me, ma poi ho anche includere l'iniezione di proprietà della mia 'applicationContext.xml' pure. Il resolver EL Spring non sembra funzionare con i bean ViewScoped che ho notato. Prova a cambiarlo in SessionScoped e verifica se la proprietà viene iniettata. –

+0

Voglio evitare applicationContext.xml (sono un po 'testardo! Grazie) Ma grazie :) – Dimman

risposta

14

Se si dispone già di contenitore primavera perché non utilizzare la sua annotazione @Autowired. Per questo, aggiorna il tuo faces-config.xml come suggerito da Boni. Poi aggiungere questi ascoltatori al tuo web.xml dopo questo

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/applicationContext.xml</param-value> 
</context-param> 

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

<listener> 
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> 
</listener> 

Quindi aggiungere questi alla vostra applicationContext.xml

<context:component-scan base-package="com.examples" /> 

Ora è possibile utilizzare le annotazioni di primavera e il bean sarà qualcosa di simile:

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

annotare il tuo MySpringBeanClass con @Service

Vedere anche:

+1

e se si desidera utilizzare Viewscope in primavera è necessario scrivere una consuetudine Viewscope classe che implementa Scopo. Segui questo post per questo [collegamento] (http://cagataycivici.wordpress.com/2010/02/17/port-jsf-2-0s-viewscope-to-spring-3-0/) – Ravi

11

inserire questo codice nel vostro faces-config.xml

<faces-config xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd" 
    version="2.0"> 
    <application> 
     <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver> 
    </application> 
</faces-config> 

Poi nella chiamata ManageBean costruttore;

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

MySpringBean dire la vostra primavera Bean Classe

+0

Ho fatto questo ma ma il mio fagiolo iniettato è sempre nullo. – Dimman

+0

Si può fare con le annotazioni nel bean di primavera e senza inserire questo nel file applicationContext.xml? Grazie – Dimman

+1

ho farlo funzionare con la soluzione WebApplicationContext CTX. Mi stavo chiedendo se potessi saltare e usare @ManagedProperty (value = "# {} mySpringBean") diretta :) – Dimman

3

Supponendo di avere configurato correttamente Primavera in web.xml e applicationContext.xml. Effettuare la seguente voce in faces-config.xml

<application> 
    <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver> 
</application> 

Il codice di esempio di cui sopra sembra che vada bene. 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 è necessario, è autoiniettato. Ho usato le impostazioni come desideri.

Una nota a margine: Dal momento che si opta per vista oscilloscopio prega di dare un'occhiata a questo link The benefits and pitfalls of @ViewScoped

Problemi correlati