【问题标题】:JSF ManagedBean initialisation failsJSF ManagedBean 初始化失败
【发布时间】:2015-02-27 09:14:44
【问题描述】:

我是 JSF 的新手,从昨天开始我就面临着一个严重的问题。以下方法 'initialiseLists' 通过调用

<f:event listener="#{Bean.initialiseLists}" type="postAddToView" />

在我看来

public void initialiseLists() {
  this.setAuthorisationsToDelete(new ArrayList<>());

  this.setRoles(new RoleManager().readAll());
  this.setReportIntervals(new ReportIntervalManager().readAll());

  AddUserCustomerBundle bundle = new AddUserCustomerBundle(new CustomerManager().readActive());

  System.out.println("");

  this.setAddKundeAuth(bundle);
}

如果我在 Eclipse 中的 Tomcat7 上使用此代码部署 Bean,一切正常。但是你可能会问'他为什么把 System.out.println("") 放在那里?'。

真正奇怪的是,如果我评论 sysout,我会收到一条错误消息。

/WEB-INF/common/createOrEdit.xhtml @14,72 listener="#{Bean.initialiseLists}": Target Unreachable, identifier 'Bean' resolved to null

取消注释 sysout 并重新启动 tomcat 后,它又可以正常工作了。谁能告诉我,我可以从哪里获得有关错误原因的更多信息?在我看来,我的 Bean 无法初始化。 Java Stacktrace 没有产生任何有趣的东西......

Feb 27, 2015 10:05:11 AM com.sun.faces.context.ExceptionHandlerImpl log
1100: JSF1073: javax.el.PropertyNotFoundException erfasst während Verarbeitung von RENDER_RESPONSE 6 : UIComponent-ClientId=, Message=/WEB-INF/common/createOrEdit.xhtml @14,72 listener="#{Bean.initialiseLists}": Target Unreachable, identifier 'Bean' resolved to null
Feb 27, 2015 10:05:11 AM com.sun.faces.context.ExceptionHandlerImpl log
1100: /WEB-INF/common/createOrEdit.xhtml @14,72 listener="#{Bean.initialiseLists}": Target Unreachable, identifier 'Bean' resolved to null
javax.el.PropertyNotFoundException: /WEB-INF/common/createOrEdit.xhtml @14,72 listener="#{Bean.initialiseLists}": Target Unreachable, identifier 'Bean' resolved to null
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(Unknown Source)    
    at com.sun.faces.facelets.tag.jsf.core.DeclarativeSystemEventListener.processEvent(Unknown Source)
    at javax.faces.component.UIComponent$ComponentSystemEventListenerAdapter.processEvent(Unknown Source)
    at javax.faces.event.SystemEvent.processListener(Unknown Source)
    at javax.faces.event.ComponentSystemEvent.processListener(Unknown Source)
    at com.sun.faces.application.ApplicationImpl.processListeners(Unknown Source)
    at com.sun.faces.application.ApplicationImpl.invokeComponentListenersFor(Unknown Source)
    at com.sun.faces.application.ApplicationImpl.publishEvent(Unknown Source)
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.buildView(Unknown Source)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(Unknown Source)
    at com.sun.faces.lifecycle.Phase.doPhase(Unknown Source)
    at com.sun.faces.lifecycle.LifecycleImpl.render(Unknown Source)
    at javax.faces.webapp.FacesServlet.service(Unknown Source)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at de.frupek.fluidman.web.filters.LoginFilter.doFilter(LoginFilter.java:43)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:315)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745) 

Edit1:如果我正在向我的 bean 添加另一个属性,例如

private int test;

会不会是环境问题(tomcat7、eclipse、ubuntu等...)?

Edit2:在我的 Bean 中使用 java.util.function.Function 似乎有问题。如果我评论所有事件,一切正常,如果我添加类似

Function<User, List<Customer>> f = User::getCustomers;

上面的异常被抛出。 JSF 的使用有 Java 8 的限制吗?

【问题讨论】:

    标签: jsf jsf-2


    【解决方案1】:

    我假设您的课程名为 Bean,而您没有为其提供别名,这将迫使 JSF 使用别名 bean 注册它。

    &lt;f:event&gt; 中,将Bean 更改为bean

    <f:event listener="#{bean.initialiseLists}" type="postAddToView" />
    

    或者,您可以将 bean 命名为 Bean,如下所示:

    @ManagedBean(name = "Bean")
    public class Bean { ... }
    

    并将当前表达式保留在&lt;f:event&gt; 的侦听器属性中。

    【讨论】:

    • Bean 来自 。奇怪的是,它可以正常工作,使用未注释的 sysout(我的视图组件没有更改)。
    • 如果我无法重现它,我不会相信我自己的话...我必须调试哪些选项?如前所述,我对 JSF 很陌生...
    • 您也可以尝试将表达式更改为&lt;f:event listener="#{userDetailBean.initialiseLists}" type-"postAddToView" /&gt;。然后重新部署应用程序并检查它是否有效。
    • 我不能轻易做到这一点,因为侦听器是在另一个 *.xhtml 文件中定义的。从有问题的 *.xhtml 设置 Bean 参数,并用特定数据填充 t:define 标记。是否有可能调试明显失败的EL解析?
    • 好的,现在还有一个类似行为的问题:如果我在我的 Bean 的任何方法中使用 Java 8 函数引用(例如 User::getCustomers),我会得到与以前相同的错误。我所有的项目都使用 java-8-oracle 并配置为源级别 1.8。代码编译但在 Bean 初始化时失败(这是我的猜测)。
    【解决方案2】:

    几个小时后,我能够“解决”我的问题,“解决方案”有效,但不是很令人满意:我不得不将引用的方法 initialiseLists 和另一个使用类成员包的方法复制到我的末尾源文件。我的 bean 现在已正确初始化(使用我所有的 t:param 东西)并且它工作得很好。

    我不知道是哪个组件导致了这种特殊行为,我希望我不会再面对它了。我的猜测是,任何 JSF 类在“扫描”我的 bean 时都会失败,但这可能是完全错误的......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-13
      • 2013-04-11
      • 1970-01-01
      • 2016-03-25
      • 2012-11-17
      • 2017-12-10
      • 2018-09-17
      • 1970-01-01
      相关资源
      最近更新 更多