我正在尝试使用 spring 为 jsf 提供托管 bean。我假设 @ManagedBean 将被 JSF 容器拾取以将 JSF 中的 EL 链接到托管 bean,即使我通过在 faces-config.xml 中配置 spring 使用来使用 spring。
Spring 将提供 bean,但现在谁来管理 bean 的范围?
我尝试在 bean 上进行注释以使其成为请求范围,但它们不起作用。
@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 进行集成时,范围不起作用。
我什至尝试在 spring 配置中设置 bean 范围,但它们在 spring 上下文(单例和原型)中按预期工作,但不是 web 请求上下文。
我试图避免使用上面的 @Scope 和 @Controller 注释,希望 JSF 将管理范围,但看起来不像。
下面是我的 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 我正在使用 spring DI 来设置由 spring 设置的 helloBean。我已经注释掉了@ManagedBean,我想我可以把它留在那里,因为它会被spring以任何方式忽略,我猜JSF不会处理它,但为了安全起见,我把它注释掉了,让JSF不处理它。
为了完成我在 faces-config 中使用下面来激活 spring 使用。
<el-resolver>
org.springframework.web.jsf.el.SpringBeanFacesELResolver
</el-resolver>
问候,
米腾。