【发布时间】: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是@RequestScopedcdi bean 作为documentation 状态。 -
而
@ViewScope是一个 JSF bean。您不能将这两种 bean 设施 JSF 和 CDI 混合使用,您必须选择其中一种。 -
正确。这肯定是根本原因,但是删除 @Model 注释会使我的应用程序不断失败 - 我需要进一步调查。我想出了一个使用javascript(将一个特定值复制到文本输入的按钮)的解决方法。我认为这已经解决了。
标签: java validation jsf-2