【问题标题】:Thymeleaf form for each object in list results in "Neither BindingResult nor plain target object"列表中每个对象的 Thymeleaf 形式导致“既不是 BindingResult 也不是普通目标对象”
【发布时间】:2018-05-01 00:14:04
【问题描述】:

我在一个列表中有多个对象,并且想为该列表中的每个对象创建一个表单(用户一次只能提交一个对象)。但是,一旦我使用 th:field 而不是 name 和 value,我就会遇到异常。也许有人可以帮助我。它仅在使用 th:each; 时发生如果我将单个对象传递给它的工作形式......我将问题减少到最低限度,因此它更具可读性:)

例外:

java.lang.IllegalStateException: Bean 名称 'o' 的 BindingResult 和普通目标对象都不能用作请求属性

控制器类:

@Controller
public class TestController {

    @GetMapping("/objectlisttest")
    public ModelAndView getObjectListTest() {
        ModelAndView mv = new ModelAndView("objectlisttest");
        List<DataObject> objects = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            DataObject o = new DataObject();
            o.setText("Dataobject");
            objects.add(o);
        }
        mv.addObject("objects", objects);
        return mv;
    }

    @PostMapping("/objectlisttest")
    public ModelAndView editObjectListTest(DataObject o, BindingResult br) {
        System.out.println(o);
        return getObjectListTest();
    }

    public static class DataObject {
        private String text;

        public String getText() {
            return text;
        }

        public void setText(String text) {
            this.text = text;
        }
    }

}

查看:

<div th:each="o : ${objects}">
    <form th:object="${o}" th:action="@{/objectlisttest}" method="POST">
        <label>Text<input type="text" th:field="*{text}"></label>
        <input type="submit">
    </form>
</div>

提前致谢

编辑: 将视图更改为

<div th:each="o : ${objects}">
    <form th:object="${o}" th:action="@{/objectlisttest}" method="POST">
        <label>Text<input type="text" th:value="*{text}" th:name="text"></label> 
        <input type="submit">
    </form>
</div>

有效。但是 th:field 会好很多...

【问题讨论】:

  • 嘿,我面临着类似的问题。你能解决这个问题吗?
  • 事实是,我切换到在前端使用角度。我认为它可以提供比任何类型的服务器端渲染更好的用户体验。一开始需要多一点时间,但以后会有回报。

标签: java spring thymeleaf


【解决方案1】:

它期望模型中有“o”对象。如果你打电话

mv.addObject("o", someObject);

我认为错误消失了,但是模型中的“o”和作为循环变量的“o”之间会有冲突。

我会说添加多个具有相同模型引用的表单并不是一个好主意(所有表单都有th:object="${o}")。

您应该重新设计逻辑。要么将每个对象单独放置在模型中,要么只创建一个表单来保留列表。

【讨论】:

  • 我可以将一个单独的对象传递给 th:object,但是我不能使用 th:field。我必须使用 th:value 和 th:name 但这可以工作。我正在寻找一种方法来告诉 thymeleaf 表单的“目标对象”的名称
猜你喜欢
  • 2020-11-16
  • 2020-02-21
  • 2016-07-22
  • 1970-01-01
  • 1970-01-01
  • 2016-07-18
  • 2013-05-23
  • 2014-04-05
  • 2020-08-27
相关资源
最近更新 更多