【问题标题】:JSF: Validation errorJSF:验证错误
【发布时间】:2014-04-11 17:31:21
【问题描述】:

这一定是这里关于 JSF 被问得最多的问题,我找到了很多资源,但还是没能解决。

所以,问题描述是我有一个带有 selectOneMenu 组件的 JSF 页面,该页面在呈现时正确填充了数据。在提交页面时收到验证错误,我怀疑这是因为该组件中的数据已经丢失,但我不知道如何将它们保存在那里。

那么,相关代码sn-ps:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
            xmlns:ui="http://java.sun.com/jsf/facelets"
            xmlns:f="http://java.sun.com/jsf/core"
            xmlns:h="http://java.sun.com/jsf/html"
            template="/WEB-INF/templates/default.xhtml">

<f:metadata>
    <f:viewParam name="user" value="#{taskController.user}" />
    <f:viewParam name="taskId" value="#{taskController.taskId}" />
   <f:event type="preRenderView" listener="#{taskController.queryTask}" /> 

<!--     <f:viewAction action="#{taskController.queryTask}" />-->

</f:metadata>

<ui:param name="pageTitle" value="Select service task" />

<ui:define name="content">
    <h:form>
        <h:outputText value="Select service task" />
          <h:panelGrid columns="2">
              <h:panelGroup>Task Id</h:panelGroup>
              <h:panelGroup>#{taskController.task.id}</h:panelGroup>
              <h:panelGroup>Created by</h:panelGroup>
              <h:panelGroup>#{taskController.task.taskData.createdBy.id}</h:panelGroup>
              <h:panelGroup>Task Status</h:panelGroup>
              <h:panelGroup>#{taskController.task.taskData.status}</h:panelGroup>



 <h:selectOneMenu value="#{taskController.selectedServiceUUID}">
        <f:selectItems id = "test" value="#{taskController.content.get('srampServiceList')}" var="service"
        itemLabel="#{service.name}" itemValue="#{service.UUID}" />
    </h:selectOneMenu> 


          </h:panelGrid>
        <h:commandButton action="#{taskController.completeSelectServiceTask}" value="Select service" />
    </h:form>
</ui:define>

selectedServiceUUID 始终为 null,因此验证失败。正如我所说,selectOneMenu 组件在加载时包含正确的数据(来自 taskController.content.get('srampServiceList')})。

我的控制器有以下注释:

import javax.enterprise.inject.Model;
import javax.faces.bean.ViewScoped;
@ViewScoped
@Model
public class TaskController

方法

taskController.completeSelectServiceTask

由于验证错误而永远不会被调用

sourceId=j_idt10:j_idt25[severity=(ERROR 2), summary=(j_idt10:j_idt25: Validation Error: Value is not valid), detail=(j_idt10:j_idt25: Validation Error: Value is not valid)]

为了完整起见,queryTask 的主体(设置所需数据)

public void queryTask() {

FacesContext facesContext = FacesContext.getCurrentInstance();
if (!facesContext.isPostback() && !facesContext.isValidationFailed()) {


    String message;
    try {

        task = taskBean.getTask(taskId);
        content = taskBean.getContent();

        message = "Loaded task " + taskId + ".";

        logger.info(message);
        } catch (Exception e) {
        message = "Unable to query for task with id = " + taskId;
        logger.log(Level.SEVERE, message, e);
        facesContext.getExternalContext().getFlash().put("msg", message);
    }

}

}

taskcontroller.selectedServiceUUID 是 String 类型,service.UUID 也是 String。 任何想法如何解决这个问题?

【问题讨论】:

  • 我注意到你在TaskController 上添加了@Model 和@ViewScoped,但@Model 是@RequestScoped cdi bean 作为documentation 状态。
  • 而 @ViewScope 是一个 JSF bean。您不能将这两种 bean 设施 JSF 和 CDI 混合使用,您必须选择其中一种。
  • 正确。这肯定是根本原因,但是删除 @Model 注释会使我的应用程序不断失败 - 我需要进一步调查。我想出了一个使用javascript(将一个特定值复制到文本输入的按钮)的解决方法。我认为这已经解决了。

标签: java validation jsf-2


【解决方案1】:

正如landal79 所建议的,问题在于使用了请求范围的@Model 注释,如documentation 中所述。用@ViewScoped && @ManagedBean 替换@Model 解决了这个问题。

【讨论】:

    【解决方案2】:

    首先请为所有元素创建 id。调试这种问题会很有用:)

    <h:commandButton value="Dodaj rekomendacje" id="addRecomendation" styleClass="btn">
     <f:ajax event="click" render="rederPanel" listener="#{customerWrapper.addRecomendationToClient()}" />
    </h:commandButton>
    

    【讨论】:

    • 我不确定这有什么帮助,但是好的,我已经为这些元素添加了 ID。
      //// .. 所以,现在错误以下列方式反映了这一点:summary=( selectServiceForm:serviceMenu: 验证错误:值无效)。
    • 是否有可能选择的值超出了可能的值。请尝试在 bean 上设置默认值。也许这可能会有所帮助。哦还有一件事。值类型是字符串吗?
    • 嗨,设置默认值没有帮助 - 发生同样的异常。似乎当我点击提交按钮时,再次调用 queryTask 方法 - taskId 丢失 - 它变为默认值 0。因此 getContent 方法将返回空内容。因此服务列表将为空。因此验证错误。虽然我知道所有的症状,但我仍然不知道如何解决它。
    • 你能在我的回答中尝试将操作更改为部分刷新吗?我认为视图范围 r 中的数据已删除并重新加载。
    猜你喜欢
    • 2017-11-10
    • 2013-10-02
    • 1970-01-01
    • 2014-05-07
    • 1970-01-01
    • 2011-09-13
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多