【发布时间】:2014-05-14 15:18:05
【问题描述】:
我正在使用 SpringMVC 和 SpringJPA。即使我不开发 Web 服务,我也更喜欢使用 REST 风格。
在前端我使用 Thymeleaf,在后端我有一个实体/模型项目,例如:
@Entity
@Table(name = "projects")
public class Project extends AbstractPersistable<Long> {
private static final long serialVersionUID = 7075433538058077502L;
@Size(min = 2, max = 30)
@NotBlank
private String name;
@NotNull
@Enumerated(EnumType.STRING)
private ProjectCategory category;
@Temporal(TemporalType.DATE)
@NotNull
@DateTimeFormat(iso = ISO.DATE)
private Date startDate;
@Temporal(TemporalType.DATE)
@NotNull
@DateTimeFormat(iso = ISO.DATE)
private Date endDate;
在 AbstractPersistable 中,setId 方法是受保护的,所以我不能将 id 目录设置为这个实体。 (我知道我可以覆盖 setId 方法,但我认为这不是对 id 进行操作的正确方法,SpringJPA 将 setId 方法定义为 protected 肯定有一些原因。)
我的控制器是这样的:
@RequestMapping(value = "/{id}/edit", method = RequestMethod.GET)
public String edit(@PathVariable("id") Long id, Model model) {
model.addAttribute("project", projectService.find(id));
return "projects/edit";
}
@RequestMapping(value = "/{id}", method = RequestMethod.PUT)
public ModelAndView update(@PathVariable("id") Long id, @Valid Project project, BindingResult result, RedirectAttributes redirect) {
if (result.hasErrors()) {
return new ModelAndView("projects/edit");
}
try {
projectService.update(project);
logger.info(project.getName() + " project has been updated.");
redirect.addFlashAttribute(GLOBAL_MESSAGE, "Project updated successfully.");
} catch (BusinessException e) {
ModelAndView view = new ModelAndView("projects/edit");
view.addObject(BUSINESS_ERROR, e.getMessage());
return view;
}
return new ModelAndView(redirectTo("/projects"));
}
现在,在我的控制器中,SpringMVC 无法设置 Project 对象的 id。一个问题是,如果 BindingResult 中有一些错误,我需要使用没有 id 值的 Project 对象将请求转发到“projects/edit”视图,以让用户输入正确的项目信息。
我的视图形式是这样的:
<form id="project-form" th:action="@{'/projects/' + ${project.id}}" th:object="${project}" th:method="put" class="form-horizontal">
</form>
那么form标签中的action属性就不会有项目的id值了。用户在更正错误后无法重新提交表单,因为操作是 /projects/null
如何正确使用 SpringMVC、SpringJPA 和 REST 风格?对我来说,对 SpringMVC API 有什么误解吗?
有没有为 SpringMVC 和 SpringJPA 提供完整 CRUD 的示例和开源项目?
【问题讨论】:
-
这个抽象类的目的是什么?对于我能想到的大多数情况来说,这似乎有点矫枉过正。
-
这个摘要来自 Spring JPA。我认为我们不应该直接修改 ID,因为实体应该由 EntityManager 管理。
标签: spring rest spring-mvc