我正在创建一个公式来填充一些实体。当我尝试发布包含 Spring MVC <form:select>
字段的表单时遇到问题。
在 Eclipse 中,我没有收到任何错误或警告消息,而在浏览器中,我收到了 http 状态 400 - 错误请求。
输入状态报告
描述由于某些被认为是客户端错误(例如,格式错误的请求语法、无效的请求消息帧或欺骗性的请求路由),服务器无法或不会处理请求。
补充说明:
我有一个 StudentDetails 实体,其中包含我目前感兴趣的 2 个字段,Classroomclassroom 和ParentsDetails parentsDetails。
Classroom 对象已经创建,并且所有这些对象都将作为模型属性存储在 LinkedHashMap
当我按照上面提到的方式提交表单时,我遇到了一个错误,但没有任何(或相关的)错误消息。
我花了一些时间调试并尝试不同的方法来处理教室地图,但都没有奏效。 实际发生了什么,不再调用控制器方法 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>
如果需要更多代码片段,我会尽快添加。提前致谢!
这是网络标签。该对象看起来像是与表单一起提交的... 我将很快添加一个包含该应用程序的视频。
编辑:演示链接:https://youtu.be/neJOLHL9REo
答案 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">