繁体   English   中英

JSF:验证错误

[英]JSF: Validation error

这一定是围绕JSF的最常见的问题,我发现了很多资源,但无论如何都没有解决。

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

因此,相关的代码片段:

<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。 任何想法如何解决这一问题 ?

首先,请为所有元素创建ID。 调试此类问题将非常有用:)

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

正如landal79所建议的那样,问题是使用@Model批注,该批注是请求范围的,如文档所述 用@ViewScoped && @ManagedBean替换@Model可解决此问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM