簡體   English   中英

注冊SpringBeanFacesELResolver后,@ Named @RequestScoped的行為類似於Spring單例

[英]After registering SpringBeanFacesELResolver, @Named @RequestScoped behaves like Spring singleton

我正在創建新的JSF 2.2應用程序並發現此問題:

我有:1)EL解析器

 <application>
    <locale-config>
        <default-locale>ru</default-locale>
    </locale-config>
    <resource-bundle>
        <base-name>i18n.messages</base-name>
        <var>msg</var>
    </resource-bundle>
    <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
    <!--<variable-resolver>org.springframework.web.jsf.WebApplicationContextVariableResolver</variable-resolver>-->
</application>

2)面對豆

@Named("SubscriberBalance")
@RequestScoped 
public class SubscriberBalance extends AbstractManagedBean {
private static final long serialVersionUID = -7018658511320101002L;
private SupportService supportService;
private SubscriberBalanceWrapper subscriberBalance;
private Long subscriberId;
private Integer subscriberType;
private Integer months;

3)Spring4 +休眠4

之后,我的bean在所有用戶之間共享數據。 它的行為類似於Spring Singleton。 似乎它忽略了JSF范圍,只處理Spring范圍。 因此,@Scope(“ request”)可以工作,但是@RequestScope不能。 如何正確做? 為什么會這樣呢? 謝謝

我想我已經解決了這個問題,可能會對某人有所幫助。

因此,我們有:

1)CDI-Java EE 6的功能

2)Spring框架

3)JSF

首先,在我的案例中,Spring從未與CDI交互。 CDI @Named注釋是JSR 330注釋。 但是從Spring 3.0開始,Spring還會掃描這些注釋。 這就是為什么在我的情況下@Named起作用的原因。

第二個@Named與@Component完全等效。 因此,我也可以在其中使用@Component。 @RequestScope和其他JSF注釋將不起作用,因為它不是JSF上下文,而是Spring上下文。 如果需要使用JSF上下文,則需要使用@ManagedBean等。@Scope注釋之所以有效,是因為它是由Spring管理的bean,因為我為我的bean啟用了包掃描。

因此,方法是:

1)使用帶有@ManagedBean批注的純JSF。 我不喜歡這樣。 缺點是:DI集成不良,工作量大等

2)使用CDI。 我不喜歡它,因為我們有春天

3)到處使用Spring。 我喜歡這種方式,因為它為我提供了系統所有部分的單向控制。 在我真正需要它們之前,我不必考慮JSF特定的注釋。

因此在JSF中,后端bean應該是:

@Controller

@范圍(...)

請看這篇文章謝謝

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM