Formulario de lista dinámica (ampliable) de Spring

Tengo problemas con las formas dinámicas en primavera. En nuestro formulario, queremos especificar un título y agregar una serie de preguntas. Tenemos un botón "agregar" para agregar el formulario de ingreso de preguntas usando jquery.

Nuestro formulario tiene un campo de pregunta cuando se solicita. Se agregan campos adicionales cada vez que se presiona el botón "Agregar". Al enviar, parece que no se están enviando los campos adicionales (el controlador recibe el primero). ¿Por qué los campos adicionales no sonrecibid ¿siendo enviado

Basé aproximadamente mi código eneste ejemplo de lista de enlace dinámico.

Mi modelo consta de una clase "Informe" que tiene un "título" y una lista de "Preguntas de investigación".
A continuación se muestra una versión corta de las dos clases de modelos. Roo se encarga de todos los captadores y setters

@Entity
@RooJavaBean
@RooEntity
public class Report{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;

    @NotEmpty
    private String title;

    @OneToMany(mappedBy="report")
    private List<Researchquestion> researchquestions;
}



@Entity
@RooJavaBean
@RooEntity
public class Researchquestion {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;    
    @NotEmpty
    private String question;
}

Aquí el jspx para el formulario

<div xmlns:c="http://java.sun.com/jsp/jstl/core"
    xmlns:form="http://www.springframework.org/tags/form"
    xmlns:jsp="http://java.sun.com/JSP/Page"
    xmlns:fn="http://java.sun.com/jsp/jstl/functions"
    xmlns:spring="http://www.springframework.org/tags"
    version="2.0">
    <jsp:output omit-xml-declaration="yes"/>

    <spring:url value="/admin/report/appendquestion" var="insert_url"/>

    <script type="text/javascript">
    $(document).ready(function() {
        var questionPosition = 0;
        $("#addQuestionButton").click(function() {
            questionPosition++;

            $.get("${insert_url}", { fieldId: questionPosition},
                function(data){
                    $("#insertAbove").before($(data));
            });
        });
    });
    </script>

    <div class="list_overview_box span-19">
        <spring:url value="/admin/report/" var="form_url"/>
        <div class="list_overview_content">
            <table>
                <form:form action="${form_url}" method="post" modelAttribute="report">
                    <tr>
                        <th class="span-3">Veld</th>
                        <th>Waarde</th>
                        <th class="span-5">Errors</th>
                    </tr>

        <!-- Title -->
                    <tr class="row">
                        <td class="vmiddle aleft">Title</td>
                        <td><form:input path="title" /></td>
                        <td></td>                           
                    </tr>

           <!-- the "add" button -->
                    <tr class="row">
                        <td class="vmiddle aleft">Researchquestions</td>
                        <td colspan="2"><input type="button" id="addQuestionButton" value="Add question" /></td>
                    </tr>
           <!-- First Researchquestion -->
                    <spring:bind path="researchquestions[0].question">
                        <tr class="row">
                            <td class="vmiddle aleft">Question 1</td>
                            <td><form:input path="${status.expression}" /></td>
                            <td></td>                           
                        </tr>
                    </spring:bind>

        <!--  Save button, extra question's are added here -->
                    <tr id="insertAbove" class="row">
                        <spring:message code="button.save" var="form_submit"/>
                        <td colspan="3"><input id="proceed" type="submit" value="${form_submit}" /></td>
                    </tr>   
                </form:form> 
            </table>
        </div>
    </div>
</div>

Abajo está la página que devuelve el controlador después de la solicitud jquery .get Tengo la idea de que necesito usar<spring:bind> al igual que en el formulario de arriba. Cuando hago esto, sin embargo, aparece un error:

java.lang.IllegalStateException: ni BindingResult ni el objeto de destino simple para el nombre de bean 'researchquestions [1]' disponible como atributo de solicitud

appendquestion.jspx

<jsp:root version="2.0"
    xmlns:jsp="http://java.sun.com/JSP/Page"
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    xmlns:tiles="http://tiles.apache.org/tags-tiles"
    xmlns:form="http://www.springframework.org/tags/form"
    xmlns:spring="http://www.springframework.org/tags"
    xmlns:roo="urn:jsptagdir:/WEB-INF/tags" >

    <tr class="row">
        <jsp:directive.page contentType="text/html;charset=UTF-8" />   

        <td class="vmiddle aleft">Question ${questionNumber +1}</td>
        <td>
            <form:input path="report.researchquestions[${questionNumber}].question" size="40" />
        </td>
        <td></td>
    </tr>

</jsp:root>

Aquí los métodos relevantes de @ModelAttribute y @requestmapping en nuestro controlador El método @ModelAttribute asegura que la Lista en una instancia de AutoPopulatingList, no estoy realmente seguro de si esto es necesario.
Si agrego@RequestParam Map formdata alcreate() (POST), entonces los datos de formulario contienenresearchquestions[0].question pero noresearchquestions\[1\].question o cualquier otro campo de pregunta que se haya agregado después de presionar el botón "agregar"

@ModelAttribute("report")
public Report getReport(Long id) {
    Report result;
    if(id != null){
        result = Report.findReport(id);
    } else{
        result = new Report();
    }

    //Make sure the List in result is an AutoPopulatingList
    List<Researchquestion> vragen = result.getResearchquestions();
    if(vragen == null){
        result.setResearchquestions(new AutoPopulatingList<Researchquestion>(Researchquestion.class));
    } else if(!(vragen instanceof AutoPopulatingList)){
        result.setResearchquestions(new AutoPopulatingList<Researchquestion>(
                vragen, Researchquestion.class));
    }

    return result;
}

/**
 * Aanmaken Report
 * @param report
 * @param result
 * @param modelMap
 * @return
 */
@RequestMapping(method = RequestMethod.POST)
public String create(@Valid @ModelAttribute("report") Report report,
        BindingResult result, ModelMap modelMap) {

    if (report == null) throw new InvalidBeanException("A report is required");

    if (result.hasErrors()) {
        modelMap.addAttribute("report", report);
        return "admin/report/create";
    }

    report.persist();

    //create questions
    for(Researchquestion question : report.getResearchquestions()){
        question.setProfielwerkstuk(report);
        question.persist();
    }

    report.merge();
    return "redirect:/admin/report";
}

@RequestMapping(value = "/appendquestion", method = RequestMethod.GET)
public String appendResearchquestionField(@RequestParam Integer fieldId, ModelMap modelMap){
    modelMap.addAttribute("questionNumber", fieldId);
    return "admin/report/appendquestion";
}

Información adiciona (según lo solicitado por Ralph)

Debajo del HTML que genera Spring, researchquestions [0] .question está en el formulario por defecto, researchquestions [1] .question se agrega después de presionar el botón "agregar"

 <tr class="row">
    <td class="vmiddle aleft">Question 1</td>
    <td>
        <input id="researchquestions0.question" type="text" value=""
             name="researchquestions[0].question">
    </td>

    <td></td>
</tr>

<tr class="row">
    <td class="vmiddle aleft">Question 2</td>
    <td>
        <input id="researchquestions1.question" type="text" size="40" value="" name="researchquestions[1].question">
    </td>
    <td></td>
</tr>

ebajo de la información relevante de Live HTTP Headers
Intenté "Este es el título" en el campo "título", "Esta es la primera pregunta" en el campo "Pregunta 1" y "Esta es la segunda pregunta" en el campo "Pregunta 2" (que ha sido agregado presionando el botón "agregar".

Está claro que researchquestions [0] .question se está enviando, pero researchquestions [1] .question no se ha enviado en absoluto en la solicitud POST.

Content-Type: application/x-www-form-urlencoded
Content-Length: 73
   title=This+is+the+title&researchquestions%5B0%5D.question=This+is+the+first+question

Mis sospechas La diferencia entre la primera pregunta (que está en el formulario por defecto) y las preguntas posteriores es que la primera pregunta usa<spring:bind> y las posteriores no. Cuando elimino la<spring:bind> etiqueta para la primera pregunta, las preguntas de investigación [0] tampoco se envían.

Como expliqué anteriormente, obtengo una IllegalStateException al agregar<spring:bind> al appendquestion.jspx. Parece que la primavera busca el objetoresearchquestions[1] en lugar dereport.researchquestions[1]

java.lang.IllegalStateException: ni BindingResult ni el objeto de destino simple para el nombre de bean 'researchquestions [1]' disponible como atributo de solicitud

Respuestas a la pregunta(1)

Su respuesta a la pregunta