我有一个包含其他实体列表的实体。应通过选中复选框填写列表。 选中复选框并提交表单时,列表将正确填写。但是,再次打开页面时,不会预先分配复选框。
为了创建复选框,我使用的是一个ID,其中ID为键,String为值(对于标签)。
如果那很重要:我正在使用Spring boot 1.2.6进行配置。
这是一个小例子:
实体类:
@Entity
public class Pizza {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@OneToMany
private List<Topping> toppings;
private String name;
// getters and setters
}
页面的Controller方法:
@RequestMapping(value = "/edit/{pizzaid}", method = RequestMethod.GET)
public ModelAndView editPizza(ModelAndView mav, @PathVariable long pizzaid) {
mav.setViewName("pizza_edit");
mav.addObject("toppings", getToppingMap());
Pizza pizza = pizzaRepo.findOne(pizzaid);
mav.addObject("pizza", pizza);
return mav;
}
private Map<Long,String> getToppingMap(){
Map<Long, String> result = new LinkedHashMap<>();
for (Topping topping : toppingRepo.findAll()) {
result.put(topping.getId(), topping.getName());
}
return result;
}
模板中的(力度)我正在使用spring提供的宏:
#springFormCheckboxes("pizza.toppings" $toppings "<br/>" "")
将表单发布回服务器时,将调用以下方法:
@RequestMapping(value = "/edit/{pizzaid}", method = RequestMethod.POST)
public ModelAndView savePizza(ModelAndView mav, @Valid Pizza pizza, BindingResult bindingResult, @PathVariable long pizzaid) {
pizza.setId(pizzaid);
pizzaRepo.save(pizza);
mav.setViewName("pizza_edit");
mav.addObject("toppings", getToppingMap());
mav.addObject("pizza", pizza);
return mav;
}
在这里,List与所选ID对应的Topping-entities完全填充。
现在,在生成的页面中,未选中任何复选框。似乎从ID到实体(请求到实体)的转换是自动完成的,但另一个方向(实体到html)不起作用?
我尝试在披萨上添加一个方法,该方法返回复选框预分配的ID:
public List<Long> getToppingIds() {
List<Long> res = new ArrayList<>();
if (toppings != null){
for (Topping t : toppings) {
res.add(t.getId());
}
}
return res;
}
然后将此调用为宏
#springFormCheckboxes("pizza.toppingIds" $toppings "<br/>" "")
现在选中复选框,这很好。但输入名称更改为toppingIds,因此在提交表单后,List未填充。
使用反映对象列表的复选框的正确方法是什么? (我发现大多数例子只使用字符串)