簡體   English   中英

BeanResult'student'的BindingResult或普通目標對象都不能用作請求屬性-Spring MVC

[英]Neither BindingResult nor plain target object for bean name 'student' available as request attribute - 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傳遞到另一個。

這些是我控制器的處理程序方法:

    /**
     * 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}">
...

我知道這很長,但是我想提供所有相關信息。 有人知道我在哪里犯錯嗎?

<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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM