action =“#{sessionHandler.login}”:目标无法访问,标识符'sessionHandler'已解析为null

时间:2014-09-15 16:50:18

标签: jsf jsf-2.2 mojarra propertynotfoundexception

我有一个测试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

为什么找不到我的支持豆?

3 个答案:

答案 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