Formularios padre / hijo al usar Playframework con Java
Tengo una entidad de "Pregunta" que tiene una "Respuesta" que tiene una lista de "Alternativas" como se muestra a continuación:
public class Question extends BaseEntity {
private String text;
private String sourceCode;
private String complement;
private Answer answer;
}
public class Answer extends BaseEntity{
private List<Alternative> alternatives;
}
Quiero hacer un formulario para que el usuario complete con una lista de preguntas. Leí tanto material y preguntas SO, pero no puedo entender cómo hacer exactamente lo que quiero con los formularios. Sé que puedo hacerlo de otra manera usando DynamicForms, esto no es lo que quiero. Mi idea es que podría hacerse de esta manera:
@(message: String, form: play.data.Form[Question])
@main("cadastrar questão") {
<script src="@routes.Assets.at("javascripts/index.js")"></script>
<div class="page-header">
<h1>@message</h1>
</div>
<body>
<style>
.top-buffer { margin-top:12px ; }
</style>
<div class="container.fluid form-group">
@helper.form(routes.Application.submit()) {
<div class="row top-buffer">
<label for="text">Enunciado:</label>
<textarea id="text" name="text" class="form-control col-md-6" placeholder="Enunciado da questão" rows="5" value="@form("text").value()"></textarea>
</div>
...
<div class="row top-buffer">
<label for="complement">Corretas:</label>
<input type="text" name="correct" class="form-control col-md-6" value="@form("complement.answer.alternatives[0]").value()">
</div>
<div class="row top-buffer">
<div class="row top-buffer">
<input type="submit" class="btn btn-primary col-md-1" value="submit">
</div>
</div>
}
</div>
</body>
}
Pero cuando trato de usar el objeto Respuesta y "Alternativas" un granNullPointerexception
explota en mi cara:
final Form<Question> questionForm = f.bindFromRequest();
final Question question = questionForm.get();
System.out.println(question);
System.out.println(question.getText());
System.out.println(question.getSourceCode());
System.out.println(question.getComplement());
//Nullpointer here:
final List<Alternative> alternatives =
question.getAnswer().getAlternatives();
alternatives.forEach(p -> System.out.println(p));
Echo de menos más documentación y ejemplos al respecto y otras cosas relacionadas. Incluso el sitio web oficial no proporciona ejemplos extensos. Especialmente cuando se trata de Java. ¿Esto da una idea de que el marco se está volviendo obsoleto o está siendo superado por otras tecnologías?
Yo uso la versión 2.4.6 de Play.