具有泛型的自动增长列表

DCK*_*ing 7 java spring spring-mvc

我有一个域模型,其中包含许多"元素",可以呈现的文本片段以显示丰富的内容.有HTML文本,纺织文本,Flash对象等.这些元件的基本功能被封装在AbstractElement,其具有实现HTMLElement,FlashElement等等.因此,该模型List<AbstractElement>包含它可以拥有的所有元素.

在编辑模型时,我希望用户能够动态添加元素,并在用户提交表单时保存这些元素.所以我所拥有的是一个可以通过一些JavaScript动态扩展的表单,其形式如下:

<form action=...>
    <!-- Other attributes -->
    <textarea name="object.elements[0].content"/>
    <textarea name="object.elements[1].content"/>
    <!-- Some elements are based on text, others on files -->
    <input type="hidden" name="object.elements[2].file" value="somevalue"/> 
    <textarea name="object.elements[3].content"/>
    <!-- Submit button -->
</form>
Run Code Online (Sandbox Code Playgroud)

提交表单时出错.很明显为什么 - 提交时,Spring会尝试实例化列表中的必需元素.由于元素列表包含AbstractElement抽象类型的对象,因此Spring无法实例化新元素.

我如何让Spring实例化适当类型的元素?可以在表单中添加类型信息,并有一些ModelAttribute吗?那会怎么样?我可以在模型中做些什么来自动执行此操作吗?

DCK*_*ing 1

我最终通过实现一个 ModelAttribute 来解决这个问题,该 ModelAttribute 通过解析原始表单数据来构造元素列表。可以通过使用HttpServletRequest对象、循环参数映射并“手动”创建所需的对象来解析原始表单数据。如果将它放入辅助函数中,它是可重用的,尽管我在使用它的每个控制器中都需要一个 ModelAttribute。

这不是理想的解决方案,但它确实有效。