“null转换器”的JSF 2.0“转换错误设置值'courseID'。!!我怎样才能避免这种错误?

时间:2012-12-01 16:16:14

标签: java jsf converter

我正在使用PrimeFaces,JPA,Hibernate和JSF 2.0开发Web应用程序。

我有两个实体StudentsCourse具有多对一的关系。

@Entity
@Table(name = "STUDENTS")
public class Students extends MainUsers implements Serializable {

    private String firstName;
    private String lastName;
    private long mobile;
    private String jobTitle;
    private int duration;
    @Temporal(TemporalType.TIMESTAMP)
    private Date startDate;
    @Temporal(TemporalType.TIMESTAMP)
    private Date endDate;

    @ManyToOne
    @JoinColumn(name = "course_id", nullable = true)
    private Course company;

    // Getters and setters.
}
@Entity
@Table(name = "COURSE")
@NamedQueries({
        @NamedQuery(name = "course.findCourseByCourseId", query = "select c from Course c where c.Id =:id"),
        @NamedQuery(name = "course.findCourseByCourseName", query = "select c from Course c where c.courseName =:courseName") })
public class Course implements Serializable {

    public static final String FIND_COURSE_BY_COURSE_ID = "course.findByCourseId";
    public static final String FIND_COURSE_COURSE_NAME = "course.findByCourseName";

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int Id;
    private String courseName;
    @OneToMany(targetEntity = Students.class, mappedBy = "course", fetch = FetchType.LAZY)
    private List<Students> students;

    // Getters and setters.

    @Override
    public int hashCode() {
        return getId();
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Course) {
            Course course = (Course) obj;
            return course.getId() == Id;
        }

        return false;
    }

}

我有一个注册页面,其中包含学生的姓名,电子邮件,密码和课程。选择我使用过的课程

<h:outputText value="Course :" />
<p:selectOneMenu value="#{courseMB.course}">
    <f:selectItem itemLabel="Select one Course" itemValue="" />
    <f:selectItems value="#{courseMB.allCourses}" var="crs"
        itemLabel="#{crs.courseName}" itemValue="#{crs.id}" />
    <f:converter converterId = "courseConverter"/>  
</p:selectOneMenu>

要创建学生,我在StudentMB课程中有以下方法:

public void createStudent() {       
    String test = student.getEmail();

    if (getStudentFacade().isStudentExist(test)){
        System.out.println(test);
    } else {
        try {
            student.setActivation_key(hashKey());
            student.setRole(Role.STUDENT);
            student.setActive(0);
            getStudentFacade().createStudent(student);
            displayInfoMessageToUser("Created with success");
            SendEmail.Send(username, password, student.getEmail(), title, linkToSend());
            loadStudent();
            resetStudent();
        } catch (Exception e) {
            displayErrorMessageToUser("Opps, we could not create the user. Try again");
            e.printStackTrace();
        }
    }
}

我真的不知道如何将课程导入StudentMB并将其保存到数据库中。目前的方法给我一个错误

  

'null Converter'的转换错误设置值'courseID'。

我尝试使用转换器,但我在参数中得到空字符串。

@FacesConverter(value="courseConverter", forClass = com.model.Course.class)
public class CourseConverter implements Converter  {

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String submittedValue) {
        CourseFacade courseFacade = new CourseFacade();
        int courseId;

        try {
            courseId = Integer.parseInt(submittedValue);
        } catch (NumberFormatException exception) {
            throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, 
                "Type the name of a Course and select it (or use the dropdown)", 
                "Type the name of a Course and select it (or use the dropdown)"));
        }

        return courseFacade.findCourse(courseId);
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object modelValue) {
        Course course = null;
        if (modelValue instanceof Course){
            course = (Course) modelValue;
            StringBuilder asString = new StringBuilder();
            asString.append(course.getId()+"-");
            asString.append(course.getCourseName());
            return asString.toString();

        }
        return "";
    }

}

这是如何引起的?如何解决?

1 个答案:

答案 0 :(得分:1)

您需要将选择项值设置为Course本身,而不是id

替换

itemValue="#{crs.id}"

通过

itemValue="#{crs}"

否则转换器只会在#{crs.id}中获得modelValue getAsString(),从而返回一个空字符串。这个空字符串又通过getAsObject()提交回服务器,这又导致异常。

您应该在ConverterException的{​​{1}}部分中抛出else,以便立即清楚转换器不适合给定的模型值。

另见: