2012-12-16 23 views
3

我有Test類,我有jsp頁面,其中包含綁定到測試對象列表的輸入。我想從我的jsp中獲取編輯信息的測試列表。 我的測試類是:Spring MVC,捕獲像@ModelAttribute這樣的對象列表

@Entity 
@Table(name = "[NewMVC].[dbo].[Tests]") 
public class Test { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "id") 
    private int id; 

    @Column(name = "testQuestion") 
    private String testQuestion; 

    @Column(name = "optionOne") 
    private String optionOne; 

    @Column(name = "optionTwo") 
    private String optionTwo; 

    @Column(name = "optionThree") 
    private String optionThree; 

    @Column(name = "subjectType") 
    private int subjectType; 

    @Column(name = "correctOptionNumber") 
    private int correctOptionNumber; 
     //gets, sets... 

,我有一個jsp中,我可以用測試編輯列表:

<form:form action="saveTestsEdits" method="POST" modelAttribute = "testWrapper"> 

    <c:forEach items="${testWrapper.testList}" var="test" varStatus="i"> 
    <h2> Test number ${i.index+1} </h2> 
    <form:hidden value="${test.id}" path = "testList[${i.index}].id" /> 
    <table> 
     <tr><td>Test Question:</td> <td><form:input path = "testList[${i.index}].testQuestion" value = "${test.testQuestion}"/> </td></tr> 
     <tr><td>Option one: </td> <td><form:input path = "testList[${i.index}].optionOne" value= "${test.optionOne}"/> </td> 
     <td>   
     <c:choose> 
     <c:when test="${test.correctOptionNumber == 1}"> <form:radiobutton path = "testList[${i.index}].correctOptionNumber" value = "1" checked = "checked"/> </c:when> 
     <c:otherwise><form:radiobutton path = "testList[${i.index}].correctOptionNumber" value = "1"/> </c:otherwise> 
     </c:choose> 
     </td> 
     </tr> 

     <tr><td>Option two: </td> <td><form:input path = "testList[${i.index}].optionTwo" value= "${test.optionTwo}"/> </td> 
     <td>   
     <c:choose> 
     <c:when test="${test.correctOptionNumber == 2}"> <form:radiobutton path = "testList[${i.index}].correctOptionNumber" value = "2" checked = "checked"/> </c:when> 
     <c:otherwise><form:radiobutton path = "testList[${i.index}].correctOptionNumber" value = "2"/> </c:otherwise> 
     </c:choose> 
     </td> 
     </tr> 


     <tr><td>Option three: </td> <td><form:input path = "testList[${i.index}].optionThree" value= "${test.optionThree}"/> </td> 
     <td>   
     <c:choose> 
     <c:when test="${test.correctOptionNumber == 3}"> <form:radiobutton path = "testList[${i.index}].correctOptionNumber" value = "3" checked = "checked"/> </c:when> 
     <c:otherwise><form:radiobutton path = "testList[${i.index}].correctOptionNumber" value = "3"/> </c:otherwise> 
     </c:choose> 
     </td> 

     </tr> 
     <tr><th>Subject type:</th></tr> 
     <tr><td>Georaphy: </td> 
     <td>   
     <c:choose> 
     <c:when test="${test.subjectType == 3}"> <form:radiobutton path = "testList[${i.index}].subjectType" value = "3" checked = "checked"/> </c:when> 
     <c:otherwise><form:radiobutton path = "testList[${i.index}].subjectType" value = "3"/></c:otherwise> 
     </c:choose> 
     </td> 
     </tr> 

     <tr><td>Mathematics: </td> 
     <td>   
     <c:choose> 
     <c:when test="${test.subjectType == 4}"><form:radiobutton path = "testList[${i.index}].subjectType" value = "4" checked = "checked"/> </c:when> 
     <c:otherwise><form:radiobutton path = "testList[${i.index}].subjectType" value = "4"/></c:otherwise> 
     </c:choose> 
     </td> 
     </tr> 

     <tr><td>History: </td> 
     <td>   
     <c:choose> 
     <c:when test="${test.subjectType == 5}"><form:radiobutton path = "testList[${i.index}].subjectType" value = "5" checked = "checked"/> </c:when> 
     <c:otherwise><form:radiobutton path = "testList[${i.index}].subjectType" value = "5"/></c:otherwise> 
     </c:choose> 
     </td> 
     </tr> 

    </table> 
    <br>   
    </c:forEach> 
    <input type="submit" value="Submit" /> 
</form:form> 
</body> 
</html> 

其實我不是發送到頁面,清晰的列出,但我有一種特殊的所謂TestWrapper類的樣子:

public class TestWrapper { 

    private List<Test> testList = null; 

    public TestWrapper(List<Test> testList) { 

     this.testList = testList; 
    } 

    public void setTestList(List<Test> testList) { 

     this.testList = testList; 
    } 

    public List<Test> getTestList() { 

     return testList; 
    } 

} 

我試着使用:

@RequestMapping(value="/saveTestsEdits", method = RequestMethod.POST) 
    public String register(@ModelAttribute("testWrapper")TestWrapper testWrapper , HttpServletRequest request) 

但它給了我一個例外:

SEVERE: Servlet.service() for servlet [appServlet] in context with path [/mvc] threw exception [Request processing failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.andrew.models.TestWrapper]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.andrew.models.TestWrapper.<init>()] with root cause 
java.lang.NoSuchMethodException: com.andrew.models.TestWrapper.<init>() 

非常感謝您!

+0

非常感謝這個問題!設法使用您的問題信息和病毒patel的答案讓我的工作!被困在一天之內! –

回答

5

當JVM無法實例化類xxx的對象時,JVM拋出異常java.lang.NoSuchMethodException: xxx.<init>()。在這種情況下,Spring並沒有實例化TestWrapper類。

你有一個列表參數的構造函數,但不是默認的。添加一個如下:

public class TestWrapper { 

    public TestWrapper() { 
    } 
} 
+0

謝謝!它幫助:)我認爲它需要一些額外的構造函數。但它變得如此簡單 –

相關問題