问题:从字段中获取对象作为参数。
代码: 具有字段的实体用户:
Long id;
String name;
Office office;
有字段的实体办公室:
Long id;
String name;
newuser.vm
<title>NEW USER</title>
<body>
<form method="post" action="/save" property="user">
Name:
<input type="text" name="name" path="name"/> <br>
Office:
<select name="office" path="office">
#foreach($office in $offices)
<option value="$office">$office.name</option>
#end
</select> <br>
<input type="submit" value="SAVE"/>
</form>
</body>
和控制器
@Controller
public class ViewController {
@Autowired
private UserService userService;
@Autowired
private OfficeService officeService;
@RequestMapping(value = "/newuser", method = RequestMethod.GET)
public ModelAndView newuser(){
return new ModelAndView("fragments/newuser.vm","command",new User());
}
@RequestMapping(value = "/save", method = RequestMethod.POST)
public ModelAndView save(@ModelAttribute("user") User user){
userService.create(user);
return new ModelAndView("redirect:/list");
}
//Model Attributes
@ModelAttribute
public void userTypesList(Model model){
model.addAttribute("types", userService.getPositions());
}
@ModelAttribute
public void officesList(Model model){
model.addAttribute("offices", officeService.getAll();
}
因此,在submition的结果中,我必须使用Office作为其中一个字段来获取新用户。但是<option value="$office">$office.name</option>
返回对象的字符串表示,但不是对象本身。所以我需要找到一种方法来正确地将其传递给/ save控制器。
当然,我可以从表单中获取字段数据,并创建一个新用户手动从表单获取office.id,然后发送另一个请求到sql获取officeById(id),但这似乎是编码的坏方法。
有人可以帮忙吗?
答案 0 :(得分:0)
您需要的是:
<option value="$office.id">$office.name</option>
这就是id字段的用途。在提交表单时,只有办公室ID会被传回,这就是在创建新用户时填写连接到办公室桌面所需的全部内容。
让$office
显示整个对象的字符串表示形式(即其toString()
方法)是预期的行为。