JSF h:selectonemenu convertor验证错误值无效

时间:2012-12-07 13:56:06

标签: jsf

我知道这已经讨论了很多,我也尝试了大部分解决方案,但我仍然遇到了这个错误:

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

以下是HTML的代码:

    <h:outputLabel value="Parent task" for="comboNewTaskParent" />
                            <div class="formRight">
                                <h:selectOneMenu id="comboNewTaskParent" value="#{taskController.parentTask}" converter="#{taskConverter}"
                                    <f:selectItems value="#{comboTaskByProject}" var="task" itemValue="#{task}" itemLabel="#{task.taskName}" />
                                </h:selectOneMenu>
                            </div>

这是我的实体bean的代码:

    package com.projectportal.entity;

import java.io.Serializable;
import javax.persistence.*;
import java.util.Date;
import java.util.List;


/**
 * The persistent class for the Task database table.
 * 
 */
@Entity
@Table(name="Task")
public class Task implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@Column(unique=true, nullable=false, length=36)
private String taskId;

@Column(length=1000)
private String taskDesc;

@Column(nullable=false)
private int taskDurationHour;

@Temporal(TemporalType.TIMESTAMP)
@Column(nullable=false)
private Date taskEstimated;

@Column(nullable=false, length=200)
private String taskName;

@Column(nullable=false)
private float taskPercentComplete;

@Temporal(TemporalType.TIMESTAMP)
@Column(nullable=false)
private Date taskStartDate;

//bi-directional many-to-one association to Priority
@ManyToOne
@JoinColumn(name="priorityId", nullable=false)
private Priority priority;

//bi-directional many-to-one association to Project
@ManyToOne
@JoinColumn(name="projectId")
private Project project;

//bi-directional many-to-one association to Status
@ManyToOne
@JoinColumn(name="statusId", nullable=false)
private Status status;

//bi-directional many-to-one association to Task
@ManyToOne
@JoinColumn(name="parentTaskId")
private Task parentTask;

//bi-directional many-to-one association to Task
@OneToMany(mappedBy="parentTask")
private List<Task> childTasks;

//bi-directional many-to-one association to Task
@ManyToOne
@JoinColumn(name="preTaskId")
private Task preTask;

//bi-directional many-to-one association to Task
@OneToMany(mappedBy="preTask")
private List<Task> dependentTasks;

//bi-directional many-to-one association to UserXTask
@OneToMany(mappedBy="task")
private List<UserXTask> userXtasks;

public Task() {
}

public String getTaskId() {
    return this.taskId;
}

public void setTaskId(String taskId) {
    this.taskId = taskId;
}

public String getTaskDesc() {
    return this.taskDesc;
}

public void setTaskDesc(String taskDesc) {
    this.taskDesc = taskDesc;
}

public int getTaskDurationHour() {
    return this.taskDurationHour;
}

public void setTaskDurationHour(int taskDurationHour) {
    this.taskDurationHour = taskDurationHour;
}

public Date getTaskEstimated() {
    return this.taskEstimated;
}

public void setTaskEstimated(Date taskEstimated) {
    this.taskEstimated = taskEstimated;
}

public String getTaskName() {
    return this.taskName;
}

public void setTaskName(String taskName) {
    this.taskName = taskName;
}

public float getTaskPercentComplete() {
    return this.taskPercentComplete;
}

public void setTaskPercentComplete(float taskPercentComplete) {
    this.taskPercentComplete = taskPercentComplete;
}

public Date getTaskStartDate() {
    return this.taskStartDate;
}

public void setTaskStartDate(Date taskStartDate) {
    this.taskStartDate = taskStartDate;
}

public Priority getPriority() {
    return this.priority;
}

public void setPriority(Priority priority) {
    this.priority = priority;
}

public Project getProject() {
    return this.project;
}

public void setProject(Project project) {
    this.project = project;
}

public Status getStatus() {
    return this.status;
}

public void setStatus(Status status) {
    this.status = status;
}

public Task getParentTask() {
    return this.parentTask;
}

public void setParentTask(Task parentTask) {
    this.parentTask = parentTask;
}

public List<Task> getChildTasks() {
    return this.childTasks;
}

public void setChildTasks(List<Task> childTasks) {
    this.childTasks = childTasks;
}

public Task getPreTask() {
    return this.preTask;
}

public void setPreTask(Task preTask) {
    this.preTask = preTask;
}

public List<Task> getDependentTasks() {
    return this.dependentTasks;
}

public void setDependentTasks(List<Task> dependentTasks) {
    this.dependentTasks = dependentTasks;
}

public List<UserXTask> getUserXtasks() {
    return this.userXtasks;
}

public void setUserXtasks(List<UserXTask> userXtasks) {
    this.userXtasks = userXtasks;
}

}

控制器:

    public @Model class TaskController {

@Inject private EntityManager em;
@Inject Identity identity;
@Inject Logger log;
@Inject Event<Task> taskEventSrc;

@Named
@Produces
private List<Task> requestTaskList;

private Task parentTask;

private Task newTask;

@Produces
@Named
public Task getNewTask(){
    return this.newTask;
}
/**
 * 
 */
public TaskController() {
    // TODO Auto-generated constructor stub
}

@PostConstruct
public void loadSelfTasks(){

    // Init
    newTask = new Task();

    // Get user from DB.
    User user = em.find(User.class, identity.getUser().getId());
    requestTaskList = new ArrayList<Task>();

    // Loop user's tasks.
    for(UserXTask userTask : user.getUserXtasks()){
        requestTaskList.add(userTask.getTask());
    }

    log.info("Tasks for user: " + user.getFirstname() + " loaded.");
}

/**
 * Create task.
 * @throws Exception
 */
public void createTask() throws Exception{
    log.info("Persistencing task: " + newTask.getParentTask().getTaskId());
    em.persist(newTask);
    taskEventSrc.fire(newTask);

    newTask = new Task();
}
/**
 * @return the parentTask
 */
public Task getParentTask() {
    return parentTask;
}
/**
 * @param parentTask the parentTask to set
 */
public void setParentTask(Task parentTask) {
    this.parentTask = parentTask;
}

}

当然还有转换器:

    @Named
/**
 * @author lastcow
 *
 */

公共类TaskConverter实现Converter {

@Inject EntityManager em;
@Inject Logger log;

/* (non-Javadoc)
 * @see javax.faces.convert.Converter#getAsObject(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.String)
 */
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value)     {
    log.info("=========== Convert to Object " + value);
    if(value.equals("0")){
        return null;
    }
    Task t =  em.find(Task.class, value);
    log.info("======== Got : " + t.getTaskName());
    return t;
}

/* (non-Javadoc)
 * @see javax.faces.convert.Converter#getAsString(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object)
 */
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
    log.info("=========== Convert to String " + value);
    return ((Task)value).getTaskId();
}

}

从记录的内容来看,转换正在运行,但是当我尝试提交表单时,总是抛出“验证错误:值无效”#39;错误,我已经在这里打了将近两天。

任何人都请提出一些建议。

顺便说一句,我尝试在Task.java中输入equals和hashCode,也没有工作。 提前谢谢。

2 个答案:

答案 0 :(得分:11)

  

验证错误:值无效

如果所选项目的the equals() method未针对true中的任何可用项目返回<f:selectItem(s)>,则会引发此错误。因此,这在技术上只有两个原因:

  1. equals()课程的Task方法丢失或损坏。
  2. 与表单显示的初始请求相比,<f:selectItems value="#{comboTaskByProject}">在表单提交的回发请求期间发生了不兼容的更改。
  3. 要解决原因#1,请确保您了解如何正确实施equals()。您可以在此处找到启动示例:Right way to implement equals contract

    要修复原因#2,请确保在回发期间#{comboTaskByProject}永远不会出现问题。最好的是将其放在视图范围内或更广泛,或者确保用于填充该列表的基于请求的条件在回发请求中保留,例如:使用<f:viewParam>

    另见:

答案 1 :(得分:1)

我不确定您使用的JSF版本。据我所知,HTML中的转换器应该像converter="javax.faces.DateTime"一样使用。此部分javax.faces.DateTimefaces-config.xml中定义的转换器名称或@FacesConverter转换器类中的转换器名称。

相关问题