2008-11-12 26 views
15

Estoy intentando vincular uno de los objetos de mi modelo a los campos de un formulario, utilizando Spring-MVC. Todo funciona bien, excepto que uno de los atributos del objeto modelo es una colección desordenada. Hacer algo comoCómo puedo vincular atributos de colección a un formulario en Spring MVC

<c:forEach items="${m.items}" var="i" varStatus="itemsRow"> 
     <form:input path="items[${itemsRow.index}]"/> 
    </c:forEach> 
    <form:errors path="items" /> 

trabajaría bien para una propiedad de tipo de lista, pero para un conjunto genera un error cuando, al presentar, se intenta crear un enlace contenido en el campo de entrada a los atributos del objeto.

¿Hay algo en Spring que salga de la caja con Sets?

+0

I misre Ad la pregunta esa primera vez y no estoy familiarizado con el uso del atributo de ruta de esa manera. – zmf

+0

heh!No me mires, lo intenté solo porque resultó en algunas búsquedas aleatorias de Google. Estoy aprendiendo la primavera por prueba y error ;-) – agnul

Respuesta

5

Creo que tiene que ser una colección ordenada. Por ejemplo, hay a chart en la referencia de Spring que habla sobre cómo hacer referencia a las propiedades. Dice:

cuenta [2] Indica el tercer elemento de la cuenta de propiedad indexada. propiedades indexadas pueden ser de tipo matriz, lista u otra ordenada de forma natural colección (énfasis suyo)

Tal vez uno de los enfoques sería añadir un captador al objeto de que, en lugar de volver a su conjunto, devoluciones Set.toArray(). Entonces su atributo de elementos haría referencia a la matriz. Por supuesto, no puede depender del pedido.

+1

Podría usar un Decorator alrededor del objeto modelo ... parece una buena idea. – agnul

1

No tengo muy claro cómo se consigue esto, pero funciona para mis propósitos.

<c:forEach items="${items}" var="i" varStatus="itemsRow"> 
     <input name="items[${itemsRow.index}].fieldName" type="text"/> 
    </c:forEach> 
<form:errors path="items" /> 
+2

gracioso cómo evitar la forma:/path cosas evita el error. – bmargulies

+0

El motivo de este comportamiento se explica aquí: http://viralpatel.net/blogs/spring-mvc-multi-row-submit-java-list/ – Alex

3

Creo que la razón por la que no funciona con un conjunto es porque no se garantiza el orden de un conjunto. Cuando intenta vincularse al primer objeto en la publicación, puede que no haya sido el primer objeto en esa lista en procesar. Por ejemplo, los elementos [0] pueden no ser los mismos entre GET y POST.

Por lo tanto, debería funcionar bien si utiliza una implementación de Set que está ordenada, como SortedSet o TreeSet.

+0

Simplemente probé esto. SortedSet es una interfaz, por lo que no puede usar eso y TreeSet no parece solucionar el problema. –

+0

Acabo de tener el mismo problema, encontré esta pregunta, cambié mi elemento de formulario para ser un TreeSet, ¡y funciona! ¡Gracias por salvarme mucho tiempo! – nont

1

Puede intentar escribir su propio Editor personalizado para hacer el trabajo, y luego registrar el editor con el controlador para el formulario. No tendría que molestarse en indexar los elementos en el conjunto de esa manera. Y como se mencionó anteriormente, si hay una forma de clasificar los elementos, puede garantizar su orden en el conjunto usando SortedSet.

-1

Puede usar una lista delimitada por punto y coma si está utilizando referencias numéricas a las ID de los objetos, y una implementación apropiada de Convertidor registrada.

datos POST tablas de clasificación = 1,2

aplicación del convertidor (ignorar las cosas JSON)

public final class LeaderboardConverter extends JsonDeserializer<Leaderboard> implements Converter<String, Leaderboard> 
    { 
     public Leaderboard convert(String source) throws IllegalArgumentException 
     { 
      Leaderboard activity = new Leaderboard(); 
      activity.setId(new Integer(source)); 
      return activity; 
     } 


     public Leaderboard deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException 
     { 
      return convert(jp.getText()); 
     } 

} 
Cuestiones relacionadas