[英]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.