Tengo un modelo de dominio que presenta una serie de "elementos", fragmentos de texto que se pueden representar para mostrar contenido enriquecido. Hay piezas de texto HTML, texto textil, objetos Flash, etc. Las características básicas de estos elementos están encapsuladas en AbstractElement
, que tiene implementaciones HTMLElement
, FlashElement
, etc. Por lo tanto, el modelo tiene un List<AbstractElement>
para contener todos los elementos que puede tener.Lista de crecimiento automático con genéricos
Al editar el modelo, deseo que el usuario pueda agregar elementos dinámicamente y guardarlos cuando el usuario envíe el formulario. Así que lo que tengo es una forma que es expandible dinámicamente con un poco de JavaScript, lo que resulta en la siguiente forma:
<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>
Esto va mal al presentar el formulario. Es bastante obvio por qué, cuando se envía, Spring intenta crear una instancia de los elementos necesarios en la lista. Como la lista de elementos contiene objetos del tipo AbstractElement
que es abstracto, Spring no puede crear instancias de elementos nuevos.
¿Qué debo hacer para que Spring cree la instancia adecuada del elemento? ¿Podría agregar información de tipo en el formulario y hacer que algún ModelAttribute lo haga? ¿Cómo funcionaría eso? ¿Hay algo que pueda hacer en el modelo que lo haga automáticamente?
¿No es un PropertyEditor diseñado para procesar un solo valor de texto (como un formato de fecha) para un objeto Java? ¿Cómo agregaría parámetros de solicitud adicionales? – DCKing
De su pregunta, parecía que el usuario final estaba llenando varias áreas de texto en un formulario HTML y enviándolo. Al enviarlo, pensé que querías determinar de alguna manera el tipo correcto de objeto para instanciar en función del contenido de cada área de texto. Puedes usar un PropertyEditor para convertir entre una cadena y cualquier tipo de objeto, así que pensé que funcionaría para ti. Si no estoy entendiendo el formulario correctamente, proporcione más detalles e intentaré ayudarlo. – khill
Como puede ver en el formulario de ejemplo, no es seguro desde el principio que el elemento tendrá un atributo 'contenido'. Podría tener un atributo 'archivo' en su lugar. Un PropertyEditor no pudo escuchar eso. Además, los diferentes tipos de contenido basado en texto no pueden necesariamente diferenciarse en función del contenido de la cadena. – DCKing