tutorial mvc initializr framework example español java spring spring-mvc

java - initializr - spring mvc netbeans



¿Mejor manera de formas dinámicas con Spring? (4)

Lo que me pregunto es si hay una forma mejor / más fácil de manejar formularios dinámicos (agregar elementos de formulario a la dom a través de js) al usar los formularios SpringMVC y Spring.

Imágenes que tienen un objeto de factura que tiene muchos LineItems.

public class Invocie { private List LineItems; public Invoice() { lineItems = ListUtils.lazyList(new ArrayList<LineItem>(), FactoryUtils.instantiateFactory(LineItem.class)); } }

Para mostrar los artículos que pertenecen a una factura que utilizo actualmente

<forEach items="${invoice.lineItems}" varStatus="i"> <form:input path="lineItems[${i.index}].productName" /> </c:forEach>

Para agregar LineItems tengo algunos js que calculan el nuevo índice y lo agregan al DOM. Al eliminar un elemento de línea, actualmente tengo que volver a numerar todos los índices y esa es la parte que me gustaría evitar, ¿es posible?


Descubrí que también es necesario decorar con un GrowthList para evitar algunos errores al agregar / configurar elementos en JSP. (También creó una aplicación SpringList personalizada que básicamente hace la doble decoración).

lineItems = GrowthList.decorate(ListUtils.lazyList(new ArrayList<LineItem>(), FactoryUtils.instantiateFactory(LineItem.class)));

Estoy de acuerdo. El problema es sin duda la eliminación de elementos.

Lo que puedes hacer es usar la sintaxis del marcador de primavera en el html. Entonces, si elimina un elemento (en el índice 2 por ejemplo) de la lista usando javascript, entonces marcaría ese índice con:

<input type="hidden" name="_lineItems[2]">

Luego, cuando se envíe el formulario, Spring verá el marcador y lo colocará en un elemento vacío (basado en la fábrica de lazylist) para lineItems 2 en lugar de ignorarlo.


He estado luchando con este problema hoy y he descubierto una solución que se describe here .



Podrías usar lo siguiente

public class InvoiceController extends SimpleFormController { protected void initBinder(HttpServletRequest request, ServletRequetDataBinder binder) throws Exception { binder.registerCustomEditor(List.class, "lineItems", new CustomCollectionEditor(List.class)() { protected Object convertElement(Object lineItem) { LineItem li = (LineItem) lineItem; // StringUtils is a jakarta Commons lang static class return (StringUtils.isBlank(li.getProductName())) ? null : li; } }); } }

Luego, en el método onBind, eliminas las referencias nulas de acuerdo con:

protected void onBind(HttpServletRequest request, Object command, BindException bindException) throws Exception { Invoice invoice = (Invoice) command; invoice.getLineItems().removeAll(Collections.singletonList(null)); }

Saludos,