2012-01-19 8 views
14

Chciałbym użyć adnotacji jsf i niektórych wiosennych adnotacji do wstrzyknięcia fasoli sprężystej/usługi do zarządzanego komponentu jsf. (w komponencie jsf chcę używać tylko adnotacji jsf) Nie chcę używać adnotacji, takich jak @named/@inject.JSF 2 inject Spring bean/service z @ ManagedProperty i bez xml

Próbowałem znaleźć rozwiązanie w sieci, ale bez powodzenia.

Przykład

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

Czy coś jak to możliwe bez użycia xml. Na przykład, bym nie lubią używać coś jak

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

lub w 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> 

jest coś takiego jak wyżej możliwe z adnotacjami i bez określającej wszystkie JSF fasola/właściwości i sprężynę fasola/właściwości dla każdego komponentu bean w plikach konfiguracyjnych xml?

+0

Funny, używam tej metody iniekcji i to działa na mnie, ale potem to także zastrzyk nieruchomości w moim 'applicationContext.xml' również. Spring resolver nie działa z ziarnami ViewScoped, które zauważyłem. Spróbuj zmienić to na SessionScoped i zobacz, czy właściwość zostanie wstrzyknięta. –

+0

Chcę uniknąć applicationContext.xml (jestem trochę uparty!) Ale dzięki :) – Dimman

Odpowiedz

14

Jeśli masz już wiosna pojemnik dlaczego nie użyć jej @Autowired adnotacji. W tym celu zaktualizuj swój faces-config.xml zgodnie z sugestią Boni. Następnie dodać te słuchaczy do web.xml po tym

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

następnie dodać je do swojej applicationContext.xml

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

Teraz można użyć adnotacji Wiosenne a fasola będzie coś takiego:

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

opisywania MySpringBeanClass z @Service

Patrz również:

+1

i jeśli chcesz używać ViewScope na wiosnę trzeba napisać niestandardowy ViewScope klasy implementującej Zakres. Śledź ten wpis w blogu dla tego [link] (http://cagataycivici.wordpress.com/2010/02/17/port-jsf-2-0s-viewscope-to-spring-3-0/) – Ravi

11

Umieść ten kod w swoich twarzach-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> 

Następnie w wywołaniu ManageBean Constructor;

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

MySpringBean oznaczać swoje Wiosna Bean Class

+0

Zrobiłem to, ale mój wstrzyknięty fasoli jest zawsze zerowy. – Dimman

+0

Czy można to zrobić za pomocą adnotacji w fasoli szparagowej i bez wstawiania tego w pliku applicationContext.xml? Dzięki – Dimman

+1

mam go pracy z roztworem WebApplicationContext CTX. Zastanawiam się, czy mógłbym go pominąć i użyć @ManagedProperty (value = „# {mySpringBean}”) bezpośredni :) – Dimman

3

Zakładając, że poprawnie skonfigurowany Wiosna w web.xml i applicationContext.xml. Dodać następujący wpis w twarze-config.xml

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

Twój przykładowy kod podany powyżej wydaje się w porządku. To co stanie się z powyższym wpisem jest zarządzane Właściwość będzie najpierw wyglądała w ziarnach zarządzanych przez JSF, jeśli nie zostanie znaleziona będzie przeszukana w ziarnach zarządzanych przez Spring. Wasza sprężyna powinna mieć odpowiednie adnotacje zaznaczone, a nazwa podana w @ManagedProperty powinna być zgodna z domyślną nazwą nadaną fasoli.

Jak wspomniano przez @Boni, który nie jest wymagany, jest automatycznie wstrzykiwany. Użyłem ustawień, jak chcesz.

Na marginesie: Od kiedy decyduje się na widok zakresu proszę spojrzeć na ten link The benefits and pitfalls of @ViewScoped