注册SpringBeanFacesELResolver后,@ Name @RequestScoped表现得像Spring单例

时间:2014-10-20 07:17:48

标签: spring jsf-2 scope

我正在创建新的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)Faces Bean

@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 + Hibernate4

之后,我的bean在所有用户之间共享数据。它表现得像春天的单身人士。它似乎忽略了JSF范围并仅处理Spring范围。所以@Scope(“请求”)正在工作,但@RequestScope不行。怎么做正确?为什么会这样?谢谢

1 个答案:

答案 0 :(得分:2)

我想我发现了这个问题,可能会对某人有所帮助。

所以我们有:

1)CDI - Java EE 6的特性

2)Spring框架

3)JSF

首先,Spring在我的案例中从不与CDI交互。 CDI @Named注释是JSR 330注释。但是从Spring 3.0开始,Spring也会扫描那些注释。所以这就是为什么在我的情况下@Named有效。

第二个,@ Name完全等同于@Component。所以我也可以在那里使用@Component。 @RequestScope和其他JSF注释将无法工作,因为它不是JSF上下文,而是Spring上下文。如果我们需要使用JSF上下文,我们需要使用@ManagedBean等。 @Scope注释的工作原理是它的Spring管理bean,因为我为我的bean启用了包扫描。

所以方法是:

1)将纯JSF与@ManagedBean注释一起使用。我不喜欢这种方式。缺点是:差的DI集成,非常方便的工作等等

2)使用CDI。我不喜欢它,因为我们有Spring

3)到处使用Spring。我喜欢这种方式,因为它让我对系统的所有部分进行单向控制。在我真正需要它之前,我不必考虑JSF特定的注释。

所以在JSF后端bean应该是:

@Controller

@Scope(...)

请参阅this article 谢谢