BindingResult和bean名称'student'的普通目标对象都不能作为请求属性 - Spring MVC

时间:2013-12-19 22:59:09

标签: java jsp spring-mvc

首先,我想说我在SO(以及其他地方)上已经阅读了很多关于此错误的问题和答案,但对于这个特定情况没有帮助。

我简单的Spring MVC Web应用程序的场景是:用户根据String属性indexNumber搜索学生(searchStudent.jsp)。 indexNumber由用户输入的3个其他属性组成:programId,rollNumber,rollYear。例如,如果programId =“M5”,rollNumber =“10”且rollYear =“2013”​​,则indexNumber将为“M5 10/13”。这在视图中完成。 indexNumber是每个学生的唯一标识符,但不是PK。重要提示:搜索学生并加载适当的页面可以自行完成。

如果学生不存在,addAfterSearchStudent.jsp页面假设加载用户在searchStudent.jsp(programId,rollNumber,indexNumber)中输入的预填充值 - 我不想让用户输入此数据两次。我写了下面的代码,我认为它将完全按照我在这里描述的那样做,但是我得到了上面提到的错误。当我对这些属性进行硬编码并尝试保存数据时,这也可以正常工作。我认为问题在于将一个jsp传递给另一个jsp。

这些是我的控制器的处理程序方法:

    /**
     * Handles and retrieves the search student page
     */
    @RequestMapping(value="/search", method = RequestMethod.GET)
    public String getSearchStudent(Model model) {

        logger.debug("Received request to show search student page");

        model.addAttribute("index", new Student());
        model.addAttribute("programList", programService.getAll());

        return "searchStudent";
    }

    /**
     * Searches for a student by delegating the processing to StudentService.
     */
    @RequestMapping(value="/search", method = RequestMethod.POST)
    public String postSearchStudent(@RequestParam(value = "program.programId") String programId,
                                    @RequestParam(value = "rollNumber") String rollNumber,
                                    @RequestParam(value = "rollYear") String rollYear,
                                    @RequestParam(value = "indexNumber") String indexNumber,
                                    Model model) {

        logger.debug("Received request to search for a student");

        model.addAttribute("program.programId", programId);
        model.addAttribute("rollNumber", rollNumber);
        model.addAttribute("rollYear", rollYear);
        model.addAttribute("indexNumber", indexNumber);

        // Call StudentService to do the actual searching
        Student student = studentService.search(indexNumber);

        // if student isn't in the db load addAfterSearchStudent.jsp, else load student.jsp
        if (student == null)
            return "addAfterSearchStudent";
        else
            return "student";
    }

    /**
     * Handles and retrieves the add (after search) student page
     */
    @RequestMapping(value="/addSearch", method = RequestMethod.GET)
    public String getAddSearchStudent(@RequestParam(value = "program.programId") String programId,
                                    @RequestParam(value = "rollNumber") String rollNumber,
                                    @RequestParam(value = "rollYear") String rollYear,
                                    @RequestParam(value = "indexNumber") String indexNumber,
                                    Model model) {

        logger.debug("Received request to show add (after search) student page");

        Student student = new Student();
        student.setRollNumber(rollNumber);
        student.setRollYear(rollYear);
        student.setIndexNumber(indexNumber);
        Program program = programService.get(programId);
        student.setProgram(program);
        model.addAttribute("student", student);

        return "addAfterSearchStudent";
    }

    /**
     * Adds a new student after search by delegating the processing to StudentService.
     * Displays a confirmation JSP page
     */
    @RequestMapping(value="/addSearch", method = RequestMethod.POST)
    public String postAddSearchStudent(@ModelAttribute("student") Student student) {

        logger.debug("Received request to add new student after search");

        // Call StudentService to do the actual adding
        studentService.addAfterSearch(student);

        // resolves to /WEB-INF/jsp/success/addStudentSuccess.jsp
        return "/success/addStudentSuccess";
    }

这是searchStudent.jsp:

<c:url var="searchUrl" value="/essays/main/student/search" />
<form:form modelAttribute="index" method="POST" action="${searchUrl}">
...

这是addAfterSearchStudent.jsp:

<c:url var="saveUrl" value="/essays/main/student/addSearch" />
<form:form commandName="student" method="POST" action="${saveUrl}">
...

我知道这很长,但我想提供所有相关信息。 有没有人知道我在哪里弄错了?

1 个答案:

答案 0 :(得分:1)

<form:form commandName="student" ...>

您的addAfterSearchStudent.jsp需要一个名为'student'的对象。在postSearchStudent()方法中,您不会在模型中添加一个。

if (student == null)
  return "addAfterSearchStudent";

您需要创建一个Student对象并添加它,就像在getAddSearchStudent()方法中一样。

    Student student = new Student();
    student.setRollNumber(rollNumber);
    student.setRollYear(rollYear);
    student.setIndexNumber(indexNumber);
    Program program = programService.get(programId);
    student.setProgram(program);
    model.addAttribute("student", student);