在 JSF 2.0 中使用 <p:remoteCommand> 按钮时找不到方法


javax.faces.FacesException: #{searchAction.searchMasterId}: javax.el.MethodNotFoundException: /files/search.xhtml @186,176 action="#{searchAction.searchMasterId}": Method not found: com.action.SearchAction@1130c0a.searchMasterId()
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:85)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:114)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:334)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1221)

收到上述错误,即使我明确提到了该方法我添加了<p:remoteCommand name="getMasterDetails" action="#{searchAction.searchMasterId}" />

我有控制器方法作为

public String getSearchMasterId() {
            //some code
    return SUCCESS;
}

如果你在 EL 2.2 上运行,有机会在代码中使用任意参数调用任意方法,例如:

public void doMyMethod() { ... };
public void doMyMethodWithParameters(String p1, int p2) { ... };

与 JSF 一起

#{bean.doMyMethod()}
#{bean.doMyMethodWithParameters(p1, p2)}

请注意末尾的括号:() 。如果不编写它们,JSF 将尝试访问所提供名称的属性,无论它是否存在:

//note that 'private String doMyMethod' property is unnecessary
public String getDoMyMethod() { return ...; }

与 JSF 一起

#{bean.doMyMethod}

请注意 EL 中括号的无意义和谓词get不合理。 #{bean.doMyMethod}将调用bean.getDoMyMethod()并返回关联的字符串。

在您的情况下,您需要访问该方法:#{searchAction.getSearchMasterId()} .

最后,值得注意的是,在某些情况下(操作方法、操作侦听器方法、AJAX 行为方法等(,没有必要同时包含括号和方法参数,因为 JSF 需要一个具有适当参数的方法,并且它会自行设置它。

使用它,它会在不使用括号的情况下产生相同的结果:#{searchAction.getSearchMasterId}

还值得注意的是,您可能会将执行业务逻辑或预设某些值的操作方法与获取要在 JSF 组件中显示的值的方法混淆。

最新更新