春季行动5-第3章

时间:2019-06-08 19:30:00

标签: spring

我正在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相同。

那么,我想念什么?

3 个答案:

答案 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 如何首先识别成分,但希望这对您有用。