【问题标题】:JSF2.0 @ManagedProperty - Target Unreachable returned null [duplicate]JSF2.0 @ManagedProperty - 无法到达的目标返回 null [重复]
【发布时间】:2013-03-29 14:10:43
【问题描述】:

我在 JSF 2.0 中使用 @ManagedProperty,但遇到以下问题。

实体类

@Entity(name="UserDetail")
@Table(name="in_user")
@SessionScoped
public class UserDetail implements Serializable{

    private static final long serialVersionUID = 1L;

    @Id
    private Integer no;
    private String userName;
    private String password;


    public Integer getNo() {
        return no;
    }
    public void setNo(Integer no) {
        this.no = no;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }


}

控制器

@ManagedBean(name="authenticator")
@RequestScoped
public class Authenticator implements Serializable {

    private static final long serialVersionUID = 1L;

    @ManagedProperty(value = "#{userDetail}")
    private UserDetail userDetail;

        // Some Code......
}

.XHTML

<p:panel header="Application Login" toggleable="true" toggleOrientation="horizontal" style="width:400px">
                <p:panelGrid columns="2" columnClasses="0">
                    <h:outputLabel value="User Name " />
                    <h:inputText value="#{authenticator.userDetail.userName}" />

                    <h:outputLabel value="Password " />
                    <h:inputSecret value="#{authenticator.userDetail.password}" />

                    <p:commandButton value="Login" action="#{authenticator.authenticate}"></p:commandButton>
                    <p:commandButton value="Log Out" action="#{authenticator.logOut}" />
                </p:panelGrid>
            </p:panel>

当我执行应用程序时,我面临以下问题..

Mar 29, 2013 7:26:56 PM com.sun.faces.lifecycle.ProcessValidationsPhase execute
WARNING: /login.xhtml @21,66 value="#{authenticator.userDetail.userName}": Target Unreachable, 'userDetail' returned null
javax.el.PropertyNotFoundException: /login.xhtml @21,66 value="#{authenticator.userDetail.userName}": Target Unreachable, 'userDetail' returned null
    at com.sun.faces.facelets.el.TagValueExpression.getType(TagValueExpression.java:100)
    at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getConvertedValue(HtmlBasicInputRenderer.java:95)
    at javax.faces.component.UIInput.getConvertedValue(UIInput.java:1030)
    at javax.faces.component.UIInput.validate(UIInput.java:960)
    at javax.faces.component.UIInput.executeValidate(UIInput.java:1233)
    at javax.faces.component.UIInput.processValidators(UIInput.java:698)
    at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214)
    at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214)
    at org.primefaces.component.panel.Panel.processValidators(Panel.java:297)
    at javax.faces.component.UIForm.processValidators(UIForm.java:253)
    at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214)
    at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214)
    at javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:1172)
    at com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

我不知道问题出在哪里。

如果我替换。

@ManagedProperty(value = "#{userDetail}")
    private UserDetail userDetail;

private UserDetail userDetail = new UserDetail();

然后它工作正常。但我想使用@ManagedProperty。请帮帮我。

【问题讨论】:

  • 你从UserDetail 中导入了哪个包@SessionScoped
  • @kolossus - 我使用了 import javax.faces.bean.SessionScoped;
  • 您确实有用于注入 bean 的 getter 和 setter,对吗?而且您确实知道,混合实体层和表示层是糟糕设计的一个很好的例子。
  • @kolossus 同意,让我们结束这次谈话:)
  • @skuntsel 哈哈。同意。

标签: java jsf jsf-2


【解决方案1】:

@SessionScoped 不添加 @ManagedBean 无效。这也没有意义,因为 JSF 将创建一个空的 UserDetails bean。

似乎您需要在那里添加一个从 UserDetails 实体中提取详细信息的服务。

@RequestScoped
public class Authenticator implements Serializable {

    private static final long serialVersionUID = 1L;

    @ManagedProperty(value = "#{userService}")
    private UserService userService;

    public UserDetail getUser(long id){
        return  userService.getUser(id);
    }
}

如果您不使用 Spring,那么您可以将您的服务应用程序设置为作用域,

@ManagedBean
@ApplicationScoped
public  class UserService {

          public UserDetail getUser(long id){
                    return  em.createQuery("Select UserDetail .... where id ...");
          }    
}

你的服务可以像下面这样如果你使用的是Spring

     @Service
     public class UserService {            
          public UserDetail getUser(long id){
                    return  em.createQuery("Select UserDetail .... where id ...");
          }    
}

如果您使用的是 spring,那么您需要添加 Spring EL 解析器来解析您的 spring 服务

<faces-config>
  <application>
    <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
  </application>
</faces-config>

【讨论】:

  • 由于以下想法,我对您的回答投了反对票。 1. OP 从未声明他使用过 Spring,也没有在他的问题中添加 spring 标签。此外,Spring-jSF 集成需要比您提到的更多的配置参数。 2. 恕我直言,@kolossus 的鹰眼发现了答案,尽管 OP 的方法需要彻底重新思考,以适应任何人的口味。
  • @skuntsel 我从来没有提到 OP 正在使用 Spring,我说如果你使用 Spring,你可以实现这种方式,否则答案中已经提到了第二种方法。如果您在 JSF 中集成 Spring 服务,那么 Spring-JSF 集成还需要哪些其他配置?
  • 你需要在 web.xml 中注册两个监听类来让 Spring 工作。关于 EL 解析器,你是对的。但是建议 OP 在这个问题的上下文中使用 Spring 与建议他使用 Struts 或原始 servlet 相同:) 这不是他想要的。
  • @skuntsel 需要这些监听器类才能使 Spring 与 Web 项目一起工作,而不是 JSF-Spring 集成才能工作。您对 Sprnig-JSF 集成所需的更多配置的评论不正确。我不建议 OP 使用任何东西,我只是建议他如何在有或没有 Spring 的情况下实现服务,因为此时他的服务不存在。
  • JSF 被用作 Web 应用程序的一部分,因此如果 OP 要使用 Spring 作为中间层,他将需要添加这两个侦听器以使 Spring 成为一部分,因此,一般的集成项目,工作,所以你的回应是不合逻辑的 :) 此外,OP 可能完全不知道 Spring,所以提到它与提到 JSF 的 EL 解析器一样重要。
【解决方案2】:

因为我只能根据我的个人经验来回答,如果你在尝试了你在这篇文章中得到的所有答案后仍然没有解决你的问题,我建议你去项目--->如果你正在使用,请清理Eclipse(我不知道其他 IDE)。实际上,我也遇到了同样的问题,只能通过这个解决方案来解决它,但仍然不知道它发生的原因。

【讨论】:

    猜你喜欢
    • 2011-11-10
    • 2011-04-14
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 2016-05-28
    相关资源
    最近更新 更多