我正在创建新的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不行。怎么做正确?为什么会这样?谢谢
答案 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 谢谢