BindingResult不起作用,thymeleaf看不到它

问题描述 投票:0回答:1

我有这个方法

    @PostMapping
public String saveOrder(@Valid @ModelAttribute OrderCreationDto order,
                        BindingResult bindingResult,
                        @AuthenticationPrincipal AuthenticatedUser authenticatedUser,
                        Model model) {
    System.out.println("BINDING " + bindingResult);

    if (bindingResult.hasErrors()) {
        fillMenuModelWithData(model);
        return "menu";
    }


    try {
        orderService.saveOrder(order, authenticatedUser);
    } catch (InsufficientFundsException e) {
        log.debug(e.toString());
        fillMenuModelWithData(model);
        return "menu";
    }
    return "redirect:/orders/history";
}

这个辅助方法只是为了用所需的属性填充模型

    private void fillMenuModelWithData(Model model) {
    model.addAttribute("sortField", DEFAULT_SORT_FIELD);
    model.addAttribute("sortDir", DEFAULT_SORT_DIR);
    model.addAttribute("filterCategory", DEFAULT_CATEGRY);
    model.addAttribute("pageSize", DEFAULT_PAGE_SIZE);
    model.addAttribute("filterCategory", DEFAULT_CATEGRY);
    model.addAttribute("order", new OrderCreationDto());
    model.addAttribute("dishList", dishService.findAllDishesSorted(
            DEFAULT_SORT_FIELD, DEFAULT_SORT_DIR));
}

如您所见,我使用

System.out.println
我的 BindingResult 打印到控制台,它看起来像这样。

绑定org.springframework.validation.BeanPropertyBindingResult:2 错误

字段“address”上对象“orderCreationDto”中的字段错误: 拒绝值 [ ];代码 [NotBlank.orderCreationDto.address,NotBlank.address,NotBlank.java.lang.String,NotBlank]; 论点 [org.springframework.context.support.DefaultMessageSourceResolvable: 代码 [orderCreationDto.address,address];参数[];默认 消息[地址]];默认信息【地址不能为空】

字段“dishIdQuantityMap”上的对象“orderCreationDto”中出现字段错误: 拒绝值 [{752=0, 952=0}];代码 [HasOrder.orderCreationDto.dishIdQuantityMap,HasOrder.dishIdQuantityMap,HasOrder.java.util.Map,HasOrder]; 论点 [org.springframework.context.support.DefaultMessageSourceResolvable: 代码 [orderCreationDto.dishIdQuantityMap,dishIdQuantityMap]; 参数[];默认消息[dishIdQuantityMap]];默认消息 [订单不含任何菜品]

看起来一切正常,让我们看看

menu
页面是否有任何错误。

               <p th:text="${#fields.errors()}"></p>
            <p th:text="${#fields.hasAnyErrors()}"></p>

我们什么也没看到

我自己尝试调试了整个晚上,非常需要你的帮助!

更新:

这是我在 Post 方法中跳过添加新订单时遇到的错误

 Caused by: java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'order' available as request attribute
java spring spring-boot thymeleaf
1个回答
0
投票

同样的问题困扰了我一段时间,解决方案在评论中。所以我想强调它是一个明确的修复。

用户M。 Deinum写道

不要将订单添加到模型中,它已经是模型的一部分了

由于绑定是自动添加的,因此您将其替换为新版本,这会使绑定结果无效,因为这是针对不同对象实例的结果

在我的例子中,我初始化了几个模型属性,并编写了一个方法来为

Get-
PostMapping
执行此操作。我没有意识到在
Post
情况下它会覆盖已经给定的模型属性。

感谢经验丰富的 Spring 用户的眼光!

© www.soinside.com 2019 - 2024. All rights reserved.