我正在Aciton -5中关注Spring,在第3章中,我面临的问题是
@PostMapping
public String processDesign(@Valid Taco design, Errors errors, @ModelAttribute Order order) {
if (errors.hasErrors()) {
return "design";
}
Taco saved = designRepo.save(design);
order.addDesign(saved);
return "redirect:/orders/current";
}
在“提交您的Taco”操作中,请求转到上述方法。但是,Taco对象中的Ingredients字段为空。
我的Taco班级与提供的here相同。
那么,我想念什么?
答案 0 :(得分:0)
移除 model.addAttribute(“ order”,new Order()); 在OrderController中将解决此问题。 TacoController正在传递填充了订单实例的模型,但是订单控制器中的get方法(特别是上面的行)向模型添加了新订单,覆盖了旧的订单详细信息。
答案 1 :(得分:0)
如果再次出现错误,则需要生成成分列表。
@PostMapping
public String designForm(@ModelAttribute("design") @Valid Taco taco, Errors errors, Model model) {
if (errors.hasErrors()) {
List<Ingredient> ingredients = ingredientRepository.findAll();
Type[] types = Ingredient.Type.values();
for (Type x : types) {
model.addAttribute(x.toString().toLowerCase(),
ingredients.stream().filter(p -> p.getType().equals(x)).collect(Collectors.toList()));
}
return "design";
}
log.info("Processing desing: " + taco);
return "redirect:/order/current";
}
答案 2 :(得分:0)
我也正在阅读 Spring in Action 5,第 3 章。我的“成分”字段也为空也有问题。我设法解决了这个问题。
在 Ch3 的某个地方,“成分”的代码改变了类型。在您的 Taco 类中,“成分”应该是 List(从 ch2 中可以看到);然而这在 Ch3 中更改为 List 没有任何提及。我通过查看本章的源代码发现了这一变化。无论如何,由于列表的类型从 String 切换到 Ingredient,Spring 将不再绑定表单中的成分列表。
我的解决方法是这样的: 1 - 将 Taco 类的“成分”字段恢复为 List 数据类型。 2 - 在 JdbcTacoRepository 类中,进行以下更改: 2a - 添加一个新的 IngredientRepository 类型的私有 final 字段 2b - 更新构造函数以自动装配上述字段 2c - 在 save(Taco taco) 方法中,使用以下更改:
for(String ingredientId : taco.getIngredients()){ Ingredient ingredient = ingredientRepo.findOne(ingredientId); saveIngredientToBurger(ingredient, burgerId); }
总的来说,成分字段为空 b/c Spring 无法将 String 对象绑定到 Ingredient 对象。我仍在尝试了解 Spring 如何首先识别成分,但希望这对您有用。