My site has a form-based test on TestPage. Each question in the test has a Question object as its model. The Questions all sit in an ArrayList in a Test object. Each Question has a "markedAnswer" String, which stores the value of the selected answer. The problem is that, for some users, the "markedAnswer" fields are become null on the TestResultsPage after the test is submitted. This behavior is not consistent (I haven't been able to replicate it) but it happens dozens of times daily, so I know that it's a real problem.
My question is, does anyone have any ideas why session.user.test.questions[i].markedAnswer becomes null for some users after they submit the test? Here's the relevant code. Important lines include: - TestPage, line 37. This inserts the test results into the database. Because this is happening correctly, I know that user.test.questions is still populated at this point. - TestResultsPage, line 12. This is where question.getMarkedAnswer()is null (and throws a NullPointerException). 1 public class TestPage extends... 2 { 3 private User user; 4 5 public TestPage() 6 { 7 user = getSession().getUser(); 8 add(new TestForm("testForm")); 9 } 10 11 final class TestForm extends ApplicationForm 12 { 13 public TestForm(final String id) { 14 super(id); 15 16 add(new ListView("questions", new PropertyModel(user, "test.questions")) { 17 18 protected void populateItem(ListItem item) { 19 final Question question = (Question) item.getModelObject(); 20 21 // answersRadioGroup will be a group of radio buttons -- one for each possible answer (4, currently) 22 RadioGroup answersRadioGroup = new RadioGroup("answers", new PropertyModel(question, "markedAnswerLetter")); 23 24 // This loop will generate a radio button for letters A, B, C, and D. Those letter are hard-coded 25 // into the database as answer selections, so we can't change them. 26 for (char letter = 'A'; letter <= 'D'; letter++) { 27 Radio radio = new Radio(letter + "", new Model(letter + "")); 28 answersRadioGroup.add(radio); 29 } 30 31 item.add(answersRadioGroup); 32 } 33 }); 34 } 35 36 protected void onSubmit() { 37 fhBD.uploadUserTestResults(user); 38 setResponsePage(TestResultsPage.class); 39 } 40 } 41 } 1 public class TestResultsPage extends... 2 { 3 private User user = getSession().getUser(); 4 5 public TestResultsPage() 6 { 7 add(new ListView("resultsListView", user.getTest().getQuestions()) { 8 9 protected void populateItem(ListItem item) { 10 final Question question = (Question) item.getModelObject(); 11 12 Label answerText = new Label("answerText", new Model(question.getMarkedAnswer().toString())); 13 answerText.setEscapeModelStrings(false); 14 item.add(answerText); 15 16 } 17 }); 18 } 19 }