我有这个豆子:
@Component
@RequestScoped
public class Hello {
@AutoWire
public DBDao myDao;
//Getters / Setters
}
当我添加@Component
时,该类现在由Spring容器管理,因此它可以为我注入我的DAO。我的问题是,当我在我的JSF文件中使用这个bean,如${hello.myDao}
时,Spring或JSF是否为我提供了bean?
如果Spring提供bean,那么当Spring容器管理它时,JSF容器如何知道这个bean?
答案 0 :(得分:1)
您似乎将JSF与EL混合在一起。那些${}
和#{}
是EL。 EL不是JSF的一部分。 EL是一个独立的API,恰好被JSF和Spring使用。 JSF和Spring都能够在EL范围内放置托管bean实例,以便EL可以找到并调用它。
当你执行#{foo}
时,EL将通过一系列已注册的EL解析器传递文字“foo”。如果其中一个可以找到与文字“foo”关联的对象实例,那么它将被返回。有默认的解析器,它们查找与请求/会话/应用程序属性名称相关联的bean实例,例如request.getAttribute("foo")
。 JSF使用那些内置解析器。 JSF基本上都是request.setAttribute("foo")
,因此EL可以找到它。
Spring有点不同(比如Java EE自己的CDI),因此需要一个自定义的EL解析器,它基本上都是所有已注册的Spring bean的寄存器。当Spring的EL解析器命中时,Spring将在其自己的寄存器中查找与文字“foo”相关联的bean,该注册表在webapp启动时基于@Component
填充。如果Spring在其寄存器中找不到匹配“foo”的任何内容,那么它将直接传递到链中的下一个EL解析器。
答案 1 :(得分:0)
您需要通过添加
告诉FacesServlet
查找Spring依赖项
<application>
<el-resolver>
org.springframework.web.jsf.el.SpringBeanFacesELResolver
</el-resolver>
</application>
到faces-config.xml
假设您的Spring上下文已在运行时正确加载,如果不是,则需要在web.xml
添加侦听器以在启动时初始化