2012-05-31 52 views
5

我試圖用spring爲jsf提供託管bean。我假設@ManagedBean將被JSF容器拾取,以將JSF中的EL鏈接到託管bean,即使我在faces-config.xml中配置spring用法時使用spring也是如此。jsf 2.0 spring 3範圍請求不起作用

春天將提供豆類,但現在誰管理豆類的範圍?

我已經嘗試過豆註釋以使其成爲請求範圍,但它們不起作用。

@ManagedBean(name="helloBean") //meant for JSF 
@RequestScoped //meant for JSF 
@Scope(value="request") //meant for spring 
@Controller //meant for spring 
public class HelloBean implements Serializable { 

其實早些時候我使用普通的JSF和@ManagedBean和@RequestScoped工作得很好。現在,當我嘗試使用彈簧進行集成時,示波器無法正常工作。

我甚至嘗試在spring配置中設置bean範圍,但是它們在spring(singleton和prototype)上下文中按預期方式工作,但不是web請求上下文。

我試圖避免使用上面的@Scope和@Controller註釋希望JSF將管理範圍,但似乎不喜歡。

下面是我的文件snippet for spring config和MyHelloBean,這可能會幫助更好地溝通。

<bean id="helloBean" class="com.mkyong.common.HelloBean" init-method="init" /> 

<bean id="myHelloBean" class="com.mkyong.common.MyHelloBean" init-method="init" > 
     <property name="helloBean" ref="helloBean"></property> 
</bean> 

@ManagedBean 
@RequestScoped 
@Scope(value="request") 
@Controller 
public class MyHelloBean implements Serializable { 

    private static final long serialVersionUID = 1L; 
    //@ManagedProperty(value = "#{helloBean}") 
    private HelloBean helloBean; 

看到上面MyHelloBean我使用彈簧DI設置爲helloBean其被彈簧精細設置。我已經評論了@ManagedBean,我認爲我可以將它留在那裏,因爲它將在任何方面被spring忽略,並且JSF不會處理它我猜,但爲了安全起見,我將它評論爲JSF不處理它。

要完成我使用下面的faces-config來激活彈簧使用。

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

問候,

米滕。

回答

2

從某種意義上說,您的方法有點令人困惑,因爲您似乎在混合Spring XML配置和Spring配置。如上所述作爲例子here,如果你使用註解配置,那麼你應該有:

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

訂購春掃描註釋。否則,如果你使用XML配置,那麼你應該有:

<bean id="helloBean" class="com.mkyong.common.HelloBean" init-method="init" scope="request" /> 

爲默認scope爲一個Spring bean是singleton

+0

你絕對正確。我能夠將scope = request添加到spring配置中,並使用它們的註釋保留我的普通舊版jsf bean,並且它按預期工作。我對春天的註釋和範圍感到困惑。其他回覆分享了一些關於範圍和注入的更多想法,但我覺得這個更簡單,更容易遷移到將spring集成到jsf中。我只知道春豆的兩個範圍。列出的其他範圍在哪裏? spring-web(上下文加載器)理解這些新的範圍,所以它們在spring-web上下文中有意義?或者他們對核心彈簧有效,我懷疑? – Miten

+0

[Spring Bean scope reference](http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-factory-scopes) – nobeh

5

我們的團隊面臨着集成JSF和Spring bean的類似問題,包括其範圍問題。在這裏,我要分享我們的知識。

作用域

基本上現在,當你在你的應用程序上下文定義,春天將要管理你的豆子,從而作用域。 Spring將JSF作用域註釋映射到他的本地作用域註釋。當兩個彈簧和JSF支持提供範圍

  • 實施例:

@RequestScoped註釋將被映射到@Scope( 「請求」)Spring的註解,等等與其它支持作用域。

  • 實施例當彈簧不支持JSF的提供範圍:

@ViewScoped未在彈簧的本地範圍的註解所定義,從而(不確定),它會使用Spring的默認範圍,這是單或請求範圍(不確定)。

豆注射

在JSF2您使用@ManagedProperty註解注入,而Spring使用@Autowired註解。 有什麼區別和選擇?

  • 將Spring Bean與@ManagedProperty:你希望注入的值必須將匹配JSF注入註釋的價值

Spring組件:@Component(值= 「valueMatches」)注射@ ManagedProperty(value =「valueMatches」)。

  • 將Spring Bean與@Autowired:

彈簧組件要注入必須不需要自定義值來區分,如果是您注射的bean的唯一實現:@Component注入@Autowired。

我們的方式

我們使用Spring的註釋來定義Bean,Scopes和Injection。我們使用@Scope(value =「desiredScope」),@Controller(value =「beanName」)和@Qualifier(value =「beanName」)標註了JSF bean的標註。稍後可以通過在@Controller註釋中定義的「beanName」值在faces-config.xml中的幫助下從JSF上下文訪問它。

我們用@Service註釋標記了Spring服務。

我們用@Autowired註解注入了Spring服務和JSF bean。

我們在Web上找到了ViewScope和FlashScope自定義實現,並將它們用於我們的bean。因此,我們沒有失去任何JSF2範圍,甚至添加了新的範圍。

希望這會有所幫助。

+0

感謝您的回覆。我想我需要閱讀一些spring web(spring mvc?)相關的註釋來理解這些新的註釋注入,服務,組件,限定符。我更喜歡不使用它們,而只是在bean配置中使用scope =「request」,正如其他答覆指出的那樣。 – Miten

+0

是的,它非常好。在我們的例子中,我們需要JSF的ViewScope,但是我們的應用程序基於Spring bean,所以這對我們來說更好。注意這裏提到的Spring和JSF2可能存在的問題,特別是如果你要注入Spring組件並使用JSF支持但不受Spring支持的狀態。 – JMelnik

+0

@JMelnik你能分享你的FlashScope代碼嗎?我很難在網上找到它 – Andre