「項目」Spring的 「<形式:請選擇。」 不工作,HTTP狀態400
@Entity
@Table(name = "projects")
public class Project extends NamedEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Long id;
@Column(name = "name")
private String name;
@Column(name = "start_date")
@Temporal(TemporalType.DATE)
@DateTimeFormat(pattern = "dd/MM/yyyy")
private Date startDate;
@Column(name = "end_date")
@Temporal(TemporalType.DATE)
@DateTimeFormat(pattern = "dd/MM/yyyy")
private Date endDate;
@Column(name = "description")
private String description;
@Column(name = "notes")
private String notes;
@ManyToOne
@JoinColumn(name = "project_status_id")
private ProjectStatus projectStatus;
@ManyToOne
@JoinColumn(name = "project_objective_id")
private ProjectObjective projectObjective;
// Getters & Setters...
}
「ProjectStatus」
@Entity
@Table(name = "project_statuses")
public class ProjectStatus {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Long id;
@Column(name = "name")
private String name;
// Getters & Setters...
}
「ProjectObjective」
@Entity
@Table(name = "project_objectives")
public class ProjectObjective {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Long id;
@Column(name = "name")
private String name;
// Getters & Setters...
}
「Controller」
@Controller
public class ProjectController {
@Autowired
private FirmManagerService firmManagerService;
@ModelAttribute("statuses")
public Collection<ProjectStatus> populateProjectStatuses() {
return this.firmManagerService.findProjectStatuses();
}
@ModelAttribute("objectives")
public Collection<ProjectObjective> populateProjectObjectives() {
return this.firmManagerService.findProjectObjectives();
}
@RequestMapping(value = "/projects/{projectId}/edit", method = RequestMethod.GET)
public String initUpdateProjectForm(@PathVariable("projectId") long projectId, Model model) {
Project project = this.firmManagerService.findProjectById(projectId);
model.addAttribute("project", project);
return "projects/createOrUpdateProject";
}
@RequestMapping(value = "/projects/{projectId}/edit", method = RequestMethod.POST)
public String processUpdateProjectForm(@ModelAttribute("project") Project project, ModelMap model) {
model.put("project", project);
return "projects/testEditProjectPage";
}
//...
}
JSP 「createOrUpdateProject」
<form:form modelAttribute="project" method="post" action="/projects/${project.id}/edit"
class="form-horizontal">
<input type="hidden" name="id" value="${project.id}"/>
<label>Name</label>
<form:input class="form-control" path="name"/>
<label>Start Date</label>
<form:input class="form-control" path="startDate"/>
<label>End Date</label>
<form:input class="form-control" path="endDate"/>
<label>Description</label>
<form:input class="form-control" path="description"/>
<label>Notes</label>
<form:input class="form-control" path="notes"/>
<label>Project's Status</label>
<form:select class="form-control" path="projectStatus" items="${statuses}" size="4"/>
<label>Project's Objective</label>
<form:select class="form-control" path="projectObjective" items="${objectives}" size="7"/>
<div class="form-group">
<button class="btn btn-default" type="submit">Update Project</button>
</div>
</form:form>
JSP 「testEditProjectPage」
<table class="table table-striped">
<tr>
<th>ID</th>
<td><b><c:out value="${project.id}"/></b></td>
</tr>
<tr>
<th>Name</th>
<td><b><c:out value="${project.name}"/></b></td>
</tr>
<tr>
<th>Status ID</th>
<td><c:out value="${project.projectStatus.id}"/></td>
</tr>
<tr>
<th>Status</th>
<td><c:out value="${project.projectStatus.name}"/></td>
</tr>
<tr>
<th>Objective ID</th>
<td><c:out value="${project.projectObjective.id}"/></td>
</tr>
<tr>
<th>Objective</th>
<td><c:out value="${project.projectObjective.name}"/></td>
</tr>
<tr>
<th>Description</th>
<td><c:out value="${project.description}"/></td>
</tr>
<tr>
<th>Notes</th>
<td><c:out value="${project.notes}"/></td>
</tr>
<tr>
<th>Start date</th>
<td><fmt:formatDate value="${project.startDate}" pattern="yyyy-MM-dd"/></td>
</tr>
<tr>
<th>End date</th>
<td><fmt:formatDate value="${project.endDate}" pattern="yyyy-MM-dd"/></td>
</tr>
項目有projectStatus和projectObjective。問題是,如果我通過使用spring的「form:select」將字段「projectStatus」和「projectObjective」發佈到「project」,我得到了一個HTTP 400錯誤(客戶端發送的請求在語法上不正確)。
,如果我不包括JSP形式這兩種選擇,它正確地顯示最近發佈的項目,但當然以NULL狀態和目標領域。
請!澄清我,如何正確使用這個「表單:選擇」發佈數據。由於這個問題,我不能「編輯」項目(通過使用entityManager.merge(項目)),因爲projectStatus和projectObjective的「id」和「name」字段爲NULL :(
我寫了這個項目,通過使用Spring的。的PetClinic代碼中的PetClinic它工作得很好我有相同的字段「projectStatus」和「projectObjective」一樣,像在的PetClinic的「寵物」實體 「類型」:
<form:form modelAttribute="pet"
<input type="hidden" name="id" value="${pet.id}"/>
<form:input class="form-control" path="name"/>
<form:input class="form-control" path="birthDate"/>
<form:select class="form-control" path="type" items="${types}" size="5"/>
<button class="btn btn-default" type="submit">Update Pet</button>
</form:form>
而不是JSTL選擇使用普通的HTML選擇 –