由于 Spring MVC <form:select>,服务器无法处理请求

时间:2021-04-26 06:56:27

标签: spring spring-mvc

我正在创建一个公式来填充一些实体。当我尝试发布包含 Spring MVC <form:select> 字段的表单时遇到问题。 在 Eclipse 中,我没有收到任何错误或警告消息,而在浏览器中,我收到了 http 状态 400 - 错误请求。

<块引用>

输入状态报告

描述由于某些被认为是客户端错误(例如,格式错误的请求语法、无效的请求消息帧或欺骗性的请求路由),服务器无法或不会处理请求。

补充说明: 我有一个 StudentDetails 实体,其中包含我目前感兴趣的 2 个字段,Classroomclassroom 和ParentsDetails parentsDetails。 Classroom 对象已经创建,并且所有这些对象都将作为模型属性存储在 LinkedHashMap 中(我在控制器的 saveAccountDetails 方法中执行此操作)。 在StudentDetails 实体与所选教室一起保存后,将创建ParentsDetails 对象。

当我按照上面提到的方式提交表单时,我遇到了一个错误,但没有任何(或相关的)错误消息。

我花了一些时间调试并尝试不同的方法来处理教室地图,但都没有奏效。 实际发生了什么,不再调用控制器方法 saveStudentDetails。 问题一定来自那个 form:select 因为如果我去掉这个输入,控制器方法将被调用,并让我在创建ParentsDetails实体时前进。

我不知道出了什么问题。 我以前使用过这种形式:选择,但 LinkedHashMap 只包含字符串,没有任何对象,它工作正常。我想那是我的问题。

StudentDetails.java

@Entity
@Table(name="student_details")
public class StudentDetails {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id")
    private int id;
    @Column(name="current_year_of_study")
    private Integer currentYearOfStudy;
    @OneToOne(cascade=CascadeType.ALL)
    @JoinColumn(name="parents_details_id")
    private ParentsDetails parentsDetails;
    @ManyToOne(cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.DETACH, CascadeType.REFRESH})
    @JoinColumn(name="class_id")
    private Classroom classroom;
    @OneToOne(mappedBy="studentDetails", cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.DETACH, CascadeType.REFRESH})
    private User user;
    @ManyToMany
    @JoinTable(name="course_studentdetails",
            joinColumns=@JoinColumn(name="student_details_id"),
            inverseJoinColumns=@JoinColumn(name="course_id")
            )
    private List<Course> courses;

... (Constructors, getters setters)

控制器.java

    @PostMapping("/save-account-details")
    public String saveAccountDetails(@ModelAttribute("theAccountDetails") AccountDetails theAccountDetails, @RequestParam("userUsername") String username, Model theModel) {
        User theUser = userService.getUser(username);
        theUser.setAccountDetails(theAccountDetails);
        accountDetailsService.saveAccountDetails(theAccountDetails);
        userService.saveUser(theUser);
        
        theModel.addAttribute("theUser", theUser);
        theModel.addAttribute("theStudentDetails", new StudentDetails());
        theModel.addAttribute("classroomsList", classroomService.getSchoolClassrooms(theUser.getAccountDetails().getCity()));
        theModel.addAttribute("entity", "StudentDetails");
        return "create-user";
    }
    @PostMapping("/save-student-details")
    public String saveStudentDetails(@ModelAttribute("theStudentDetails") StudentDetails theStudentDetails, @RequestParam("userUsername") String username, Model theModel) {
        User theUser = userService.getUser(username);
        theUser.setStudentDetails(theStudentDetails);
        studentDetailsService.saveStudentDetails(theStudentDetails);
        userService.saveUser(theUser);
        
        theModel.addAttribute("theUser", theUser);
        theModel.addAttribute("theParentsDetails", new ParentsDetails());
        theModel.addAttribute("entity", "ParentsDetails");
        return "create-user";
    }
    @PostMapping("/save-parents-details")
    public String saveParentsDetails(@ModelAttribute("theParentsDetails") ParentsDetails theParentsDetails, @RequestParam("userUsername") String username, Model theModel) {
        User theUser = userService.getUser(username);
        theUser.getStudentDetails().setParentsDetails(theParentsDetails);
        parentsDetailsService.saveParentsDetails(theParentsDetails);
        userService.saveUser(theUser);
        
        theModel.addAttribute("theUser", theUser);
        theModel.addAttribute("theParentsDetails", new ParentsDetails());
        theModel.addAttribute("entity", "ParentsDetails");
        return "create-user";
    }

创建用户.jsp

<c:if test="${entity == 'StudentDetails'}">
                        <c:url var="saveStudentDetails" value="save-student-details">
                            <c:param name="userUsername" value="${theUser.username}" />
                        </c:url>
                        <form:form action="${saveStudentDetails}" modelAttribute="theStudentDetails" method="POST">
                            <form:hidden path="id" />
                            <div class="form-area">
                                <div class="input-group mb-3">
                                    <div class="input-group-prepend">
                                        <span class="input-group-text" id="inputGroup-sizing-default">Current Year of Study</span>
                                    </div>
                                    <form:input type="text" class="form-control" path="currentYearOfStudy" aria-label="Default" aria-describedby="inputGroup-sizing-default" />
                                </div>
                                <div class="input-group mb-3">
                                    <div class="input-group-prepend">
                                        <label class="input-group-text" for="inputGroupSelect01">Classroom</label>
                                    </div>
                                    <form:select path="classroom" class="custom-select" id="inputGroupSelect01">
                                        <form:option value="" label="Select classroom..." />
                                        <form:options items="${classroomsList}" />
                                    </form:select>
                                </div>
                                <button type="submit" class="btn btn-outline-secondary btn-block">Submit</button>
                            </div>
                        </form:form>
                    </c:if>
                    <c:if test="${entity == 'ParentsDetails'}">
                        <c:url var="saveParentsDetails" value="save-parents-details">
                            <c:param name="userUsername" value="${theUser.username}" />
                        </c:url>
                        <form:form action="${saveParentsDetails}" modelAttribute="theParentsDetails" method="POST">
                            <form:hidden path="id" />
                            <div class="form-area">
                                <div class="input-group mb-3">
                                    <div class="input-group-prepend">
                                        <span class="input-group-text" id="inputGroup-sizing-default">Father First Name</span>
                                    </div>
                                    <form:input type="text" class="form-control" path="fatherFirstName" aria-label="Default" aria-describedby="inputGroup-sizing-default" />
                                </div>
                                <div class="input-group mb-3">
                                    <div class="input-group-prepend">
                                        <span class="input-group-text" id="inputGroup-sizing-default">Father Last Name</span>
                                    </div>
                                    <form:input type="text" class="form-control" path="fatherLastName" aria-label="Default" aria-describedby="inputGroup-sizing-default" />
                                </div>
                                <div class="input-group mb-3">
                                    <div class="input-group-prepend">
                                        <span class="input-group-text" id="inputGroup-sizing-default">Father Telephone</span>
                                    </div>
                                    <form:input type="text" class="form-control" path="fatherTelephone" aria-label="Default" aria-describedby="inputGroup-sizing-default" />
                                </div>
                                <div class="input-group mb-3">
                                    <div class="input-group-prepend">
                                        <span class="input-group-text" id="inputGroup-sizing-default">Mother First Name</span>
                                    </div>
                                    <form:input type="text" class="form-control" path="motherFirstName" aria-label="Default" aria-describedby="inputGroup-sizing-default" />
                                </div>
                                <div class="input-group mb-3">
                                    <div class="input-group-prepend">
                                        <span class="input-group-text" id="inputGroup-sizing-default">Mother Last Name</span>
                                    </div>
                                    <form:input type="text" class="form-control" path="motherLastName" aria-label="Default" aria-describedby="inputGroup-sizing-default" />
                                </div>
                                <div class="input-group mb-3">
                                    <div class="input-group-prepend">
                                        <span class="input-group-text" id="inputGroup-sizing-default">Mother Telephone</span>
                                    </div>
                                    <form:input type="text" class="form-control" path="motherTelephone" aria-label="Default" aria-describedby="inputGroup-sizing-default" />
                                </div>
                                <button type="submit" class="btn btn-outline-secondary btn-block">Submit</button>
                            </div>
                        </form:form>
                    </c:if>

如果需要更多代码片段,我会尽快添加。提前致谢!

Network tab

这是网络标签。该对象看起来像是与表单一起提交的... 我将很快添加一个包含该应用程序的视频。

编辑:演示链接:https://youtu.be/neJOLHL9REo

1 个答案:

答案 0 :(得分:0)

尝试在 form 标签中添加 multipart form-data 到 enctype,它可能会起作用。

来自:

<form:form action="${saveStudentDetails}" 
modelAttribute="theStudentDetails" method="POST">

致:

<form:form action="${saveStudentDetails}" enctype="multipart/form-data" 
modelAttribute="theStudentDetails" method="POST">