【问题标题】:Error trying to execute method after error catch错误捕获后尝试执行方法时出错
【发布时间】:2013-08-20 21:11:05
【问题描述】:

我有这个jsf代码

<h:form>
    <h:inputText value="#{agreement.serviceId}"/>
    <h:commandButton value="Enter" action="#{agreement.build}" />
    <h:form rendered="#{!agreement.valid}">
      <h:outputText value="Service id not valid. Please try again"/>
    </h:form>   
<h:form> 

这是作用域 bean 的构建方法。

public String build(){
  try{
     ...//lots of backend logic
     valid = true;
     return "/agreementDetail.xhtml?faces-redirect=true";
  }catch(Exception e){
     valid = false;
     return null;
  }
}

基本上,这是我需要的行为:

用户输入一个 serviceId。如果此服务 ID 有效,它会将用户重定向到 agreementDetail.xhtml 页面。如果为 false,则用户将保留在 main.xhtml 页面中并呈现“服务 ID 无效...”消息。

这就是正在发生的事情:

如果用户输入了正确的服务 ID,一切正常。如果用户返回 main.xhtml 并输入了错误的服务 id,则错误会正确显示。但是现在,如果用户输入了正确的服务 ID,则 build() 方法不会执行。(我已经通过日志记录确认了这一点)。

基本上,一旦用户输入了错误的值,除非用户注销并再次登录,否则 build() 方法将不会再次执行。显然,当 build() 发现错误并捕获异常时,事情就发生了。

有什么想法吗?

【问题讨论】:

  • 目前发布的代码似乎与问题描述不符。操作方法声明为private。这不应该被执行,而是在第一次调用时抛出了一个 EL 异常。顺便说一句,你为什么不只是使用带有&lt;h:messages&gt; 的面孔消息?这种嵌套形式是一种丑陋的方法,只会产生syntactically invalid HTML
  • 对不起,我弄错了。方法是公开的,我只是写错了。我将进行编辑以将其设置为公开。另外,我知道 更好,我只是发现这种行为很有趣,我正试图了解发生了什么。

标签: jsf jsf-2


【解决方案1】:

您在代码中嵌套表单。这在 JSF/HTML 中是不允许的。您应该用&lt;h:panelGroup&gt; 替换内部表单,一切都应该没问题。

【讨论】:

  • 他没有从嵌套表单中提交,所以这不太可能是原因。另请参阅我对这个问题的评论。
猜你喜欢
  • 2013-01-08
  • 1970-01-01
  • 2016-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-08
相关资源
最近更新 更多