【问题标题】:Neither BindingResult nor plain target object for bean name errorBean 名称错误的 BindingResult 和普通目标对象都不是
【发布时间】:2020-11-07 14:30:03
【问题描述】:

返回对象列表

   @RequestMapping("/mvt")
            public String showMvt(Model model){
          
                    model.addAttribute("counts", mouvementRepository.findAll());
        
                return"mvt_";
            } 

更新单线控制器

   @RequestMapping(value="/updateMvt/{idmvt}",method = {RequestMethod.GET})
            public String updateMvt(@PathVariable(value = "idmvt") int idcpn, @Valid @ModelAttribute("mvt") Mouvement mvt,BindingResult result) {
             mouvementRepository.save(mvt);
            return "redirect:/mvt";
        }

我尝试像这样编辑 tr th:each 内的车道

    <tr th:each="count:${counts}">
 <form action="#" th:action="@{/updateMvt/{idmvt}(idmvt=${count.idmvt})}" th:object="${count}" method="put">

                            <table border="0" cellpadding="10">
                                <tr>
                                    <td>etat</td>
                                    <td>
                                        <select class="select-css" th:field="*{count.etat}">
                                            <option th:value="Enregistrement">Enregistrement</option>
                                            <option th:value="Embarquement">Embarquement</option>
                                            <option th:value="Decollé">Decollé</option>
                                            <option th:value="Annulé" selected>Annulé</option>
                                            <option th:value="null" selected>Aucun</option>
                                            </select>
                                    </td>
                                </tr>
                            </table>
                        </form>

我是 spring 新手,我知道这个解决方案看起来很糟糕,但我正在努力做到最好。 所以我试着这样做,但我得到了错误:

Bean 名称“count”的 BindingResult 和普通目标对象都不是 可用作请求属性

更新 ---------------------------------- ----------------------

到目前为止,我设法创建了一个像这样的包装类

public class mvtForm {

        private int version;
        private List<Mouvement> mouvements;//Getters and setters are included

在我的控制器中,我设置了如下所示的移动属性:

@ModelAttribute("wrapper")
@RequestMapping(value = "/mvtall")
public String processQuery(@ModelAttribute mvtForm wrapper, Model model) {
    wrapper.setMouvements(mouvementRepository.findAll());
 
    model.addAttribute("wrapper",wrapper);

   return "mvt_all";
}

现在我得到了我需要的视图,

但是有没有办法使用 JpaRepository 将 PUT 提交到每个通道?

【问题讨论】:

    标签: spring spring-boot spring-mvc spring-data thymeleaf


    【解决方案1】:

    th:object 必须引用模型中的对象,而不是迭代中的对象。因此,您需要在加载页面之前将 count 对象传递给控制器​​中的模型,例如通过在控制器中定义此方法:

    @ModelAttribute("updateCount")
    public Count count() {
        return new Count(); 
    }
    

    类 Count 应该有一个字段 int 版本,对于每个 Count 对象都是唯一的,这对于更新很重要。不要忘记 getter、setter 和默认构造函数 - 这对 Thymeleaf 很重要。

    @ModelAttribute("listOfCounts")
    public List<Count> listOfCounts() {
        return listOfCounts; //has to be predefined somewhere in class 
                             //as it will be reused throughout application. 
    }
    

    当您迭代时,您将迭代 listOfCounts。但是,当更新并按下更新按钮时,您将绑定 updateCount 对象。确保在百里香中有一个带有版本的隐藏字段。这样,当你的控制器接收到更新请求时,你会收到正确版本的 updateCount 对象,你可以通过版本从 listOfCounts 中找到正确的 Count 对象并更新它。

    【讨论】:

    • 非常感谢!
    • 你好,但我想将对象从 th:each 分配给 th:object,因为这一切的目标是更新同一个表中的字段和打印它们的时间。请问有什么想法吗?
    • 谢谢,我会试试这个解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多