使用spring MVC,我如何创建一个不映射到实体的表单(即它具有来自多个实体的属性)。
我还要验证并使用具有错误集合等的“结果”对象。
这是什么在线示例?我需要看到它才能理解它(新手)
答案 0 :(得分:0)
您只需创建一个包含表单所需的所有属性的新类,并将其用作表单的模型属性。在接听电话上,您也可以使用此类型。 Spring会自动为您绑定属性。您还应该考虑使用JSR-303验证注释。
一般方法是加载所有必需的实体,以便在GET请求中创建表单支持对象。然后将该表单支持对象放入模型中。在POST / PUT请求中,您必须重建触摸的实际实体。通常,您再次加载它们,然后将新提交的部分数据应用于它们。
一般来说,构建一个专用组件来处理组装行为可能是一个好主意,以免您使用该代码污染控制器。
/**
* Prepares the form by setting up a custom form backing object.
*/
@RequestMapping(value = "account/{id}", method = GET)
public String processGet(@PathVariable("id") Long id, Model model) {
Account account = accountService.getAccount(id);
return prepareForm(dtoAssembler.createFormFor(account), model);
}
/**
* Process form submission. Uses JSR-303 validation and explicit error
* handling.
*/
@RequestMapping(value = "account/{id}", method = PUT)
public String processGet(@ModelAttribute("accountForm") @Valid AccountForm form, Errors errors, Model model) {
if (errors.hasErrors()) {
return prepareForm(form, model);
}
Account account = accountService.getAccount(form.getId());
accountService.save(dtoAssembler.applyData(account, form));
return "redirect:/accounts";
}
/**
* Populates the given {@code Model} with the given {@code AccountForm}
* and returns the view to show the form.
*/
private String prepareForm(AccountForm form, Model model) {
model.addAttribute("accountForm", form);
return "account";
}
我在这里写这篇文章是为了强调正在发生的事情。在现实世界中,我可能会让DtoAssembler完成服务的所有工作(所以我将服务注入汇编程序)。
为了便于使用Dozer将数据从DTO传输到域对象,BeanUtils或类似的东西可能是合理的。