我有一个测试JSF页面:
<!DOCTYPE html>
<html xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http:/java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui">
<h:head></h:head>
<h:body>
<h:form>
<h:commandButton id="testButton" value="test" action="#{sessionHandler.login}"></h:commandButton>
</h:form>
</h:body>
</html>
commandButton调用一个名为SessionHandler的支持bean:
import javax.faces.bean.SessionScoped;
import javax.inject.Inject;
import javax.inject.Named;
@Named
@SessionScoped
public class SessionHandler {
@Inject
private SessionEJB session = new SessionEJB();
public SessionHandler(){}
public String login(){
return "video.xhtml";
}
}
问题是当我点击按钮时,它没有找到支持bean方法。我收到此错误:
javax.servlet.ServletException: javax.el.PropertyNotFoundException: /test.xhtml @10,94 action="#{sessionHandler.login}": Target Unreachable, identifier 'sessionHandler' resolved to null
root cause
javax.faces.el.EvaluationException: javax.el.PropertyNotFoundException: /test.xhtml @10,94 action="#{sessionHandler.login}": Target Unreachable, identifier 'sessionHandler' resolved to null
root cause
javax.el.PropertyNotFoundException: /test.xhtml @10,94 action="#{sessionHandler.login}": Target Unreachable, identifier 'sessionHandler' resolved to null
为什么找不到我的支持豆?
答案 0 :(得分:2)
您似乎正在混合使用JSF bean和CDI bean,但您不能。只需将导入javax.faces.bean.SessionScoped
替换为javax.enterprise.context.SessionScoped
,您就可以全部使用CDI。
SessionScoped bean也应该具有钝化功能,因此可以实现Serializable
。
答案 1 :(得分:2)
我发现了问题,我发布的原始代码无法看到,所以,我为此道歉。尽管错误说明sessionHandler被解析为null,但实际上它是我引用的无法找到的EJB。这是因为我将EJB Jar导入构建路径而不是将其放入WEB-INF / lib文件夹中。虽然,我认为适当的方法是创建企业应用程序项目并引用EJB Jar项目和Web项目。所以,我的问题与我的代码无关,而是与我引用项目的方式有关。我希望这有助于任何人遇到类似的问题。
答案 2 :(得分:1)
在Java EE中,有两种方法可以为JSF声明bean。使用旧的托管bean工具:
@javax.faces.bean.ManagedBean
@javax.faces.bean.SessionScoped
public class SessionBean {}
或使用CDI(现在推荐的方式)
@javax.inject.Named
@javax.enterprise.context.SessionScoped
public class SessionBean {}
要启用CDI,您还需要beans.xml in the class path。