Доброго времени суток. Сразу хочу извинится за возможно глупый вопрос и за плохую, по моему мнению, реализацию. Имеется такая ситуация, хочется передать в форму информацию о пользователе(фамилия, имя) и ещё одно поле(в котором будет производиться выборка нужного параметра).
В моём случае я имею два объекта Student(который берется из БД и хранит фамилию и имя) и список Absent(которые должен хранить сначала два значения, а после того как пользователь сделает свой выбор, одно).
Сначала я хотел реализовать это с помощью Map, но из-за своей неопытности столкнулся с проблема вывода фамилий в алфавитном порядке(это является обязательным условием), поэтому я создал промежуточный DAO(наверное следовало его назвать DTO, так как он отвечает только за транспортировку данных), который в свою очередь хранит список объектов типа AbsentWithStudent, который хранит необходимые данные объекта Student и список Absent.
Контроллер:
@Autowired
private APP_UserRepository userRepository;
@Autowired
private TeachingRepository teachingRepository;
@Autowired
private GroupRepository groupRepository;
@Autowired
private SubjectRepository subjectRepository;
@Autowired
private AbsentRepository absentRepository;
@PostMapping("/teacher/createLesson")
public String postCreateLessonChoose(Model model, Principal principal, @RequestParam(name = "goodGroup") String goodGroup, @RequestParam(name = "goodSubject") String goodSubject){
//Select info from database
APP_User user = userRepository.findByUsername(principal.getName()).get();
Group group = groupRepository.findByName(goodGroup).get();
Subject subject = subjectRepository.findByName(goodSubject).get();
List<APP_User> students = userRepository.findByGroup(group);
//Create list with absent
List<Absent> absents = new ArrayList<>();
absents.add(absentRepository.findByName("Присутствует").get()); // be careful!
absents.add(absentRepository.findByShortname("НБ").get());
//Take current date
DateTimeFormatter d = DateTimeFormatter.ofPattern("dd.MM.yyyy");
String date = LocalDate.now().format(d);
//DAO for form in frontend
createAbsentDAO absentDAO = new createAbsentDAO();
for (int i = 0; i < students.size(); i++) {
APP_User student = students.get(i);
absentDAO.addObjectToList(new AbsentWithStudent(student.getId(), student.getFirstname(), student.getLastname(), absents, date));
}
//Sent DAO to frontend
model.addAttribute("absentDAO", absentDAO);
return "/teacher/createLesson";
}
Страница, которая должна создаваться в результате работы контроллера:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org"
xmlns:sec="https://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
<head>
<title>Текст</title>
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css" integrity="sha384-WskhaSGFgHYWDcbwN70/dfYBj47jz9qbsMId/iRN3ewGhXQFZCSftd1LZCfmhktB" crossorigin="anonymous">
</head>
<body>
<!-- Optional JavaScript -->
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js" integrity="sha384-smHYKdLADwkXOn1EmN1qk/HfnUcbVRZyYmZ4qpPea6sjB/pTJ0euyQp0Mk8ck+5T" crossorigin="anonymous"></script>
<div class="row justify-content-center">
<div class="col-6 mt-4 shadow p-3 mb-5 ml-3 mr-3 bg-white rounded">
<p class="mt-1 mb-1 font-weight-light text-primary h2 mx-auto bg-white rounded"></p>
<form th:action="@{/teacher/createLesson/confirm}" method="post" modelAttribute="absentDAO">
<table class="table table-bordered">
<thead>
<tr>
<th>Студент</th>
<th></th>
</tr>
</thead>
<tbody>
<td th:each="dao,itemStat : ${absentDAO.list}" th:text="*{dao.lastname}" th:field="*{dao.lastname}" th:value="*{dao.lastname}"></td>
<td th:each="list : ${absentDAO.list.absentList}">
<select>
<option th:value="${list.shortname}" th:text="${list.shortname}"></option>
</select>
</td>
<!-- HIDDEN!!!!!-->
<!-- <input type="hidden" name="group" th:field="*{group}">-->
</tbody>
</table>
<button type="submit" class="btn btn-primary mx-auto">Создать</button>
</form>
</div>
</div>
</body>
</html>
Model, который хранит данные объекта Student и списка Absent
public class AbsentWithStudent{
private int id;
private String firstname;
private String lastname;
private List<Absent> absentList;
private String date;
public AbsentWithStudent(int id, String firstname, String lastname, List<Absent> absentList, String date) {
this.id = id;
this.firstname = firstname;
this.lastname = lastname;
this.absentList = absentList;
this.date = date;
}
public AbsentWithStudent() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getFirstname() {
return firstname;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
public String getLastname() {
return lastname;
}
public void setLastname(String lastname) {
this.lastname = lastname;
}
public List<Absent> getAbsentList() {
return absentList;
}
public void setAbsentList(List<Absent> absentList) {
this.absentList = absentList;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
}
DAO
public class createAbsentDAO {
private List<AbsentWithStudent> list = new ArrayList<>();
public void addObjectToList(AbsentWithStudent student){
this.list.add(student);
}
public createAbsentDAO() {
}
public List<AbsentWithStudent> getList() {
return list;
}
public void setList(List<AbsentWithStudent> list) {
this.list = list;
}
}
При выполнение запроса к странице получаю данную ошибку:
There was an unexpected error (type=Internal Server Error, status=500).
An error happened during template parsing (template: "class path resource [templates//teacher/createLesson.html]")
org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "class path resource [templates//teacher/createLesson.html]")
at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:241)
...
Caused by: org.attoparser.ParseException: Exception evaluating SpringEL expression: "absentDAO.list.absentList" (template: "/teacher/createLesson" - line 69, col 21)
at org.attoparser.MarkupParser.parseDocument(MarkupParser.java:393)
at org.attoparser.MarkupParser.parse(MarkupParser.java:257)
at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:230)
... 87 more
Caused by: org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating SpringEL expression: "absentDAO.list.absentList" (template: "/teacher/createLesson" - line 69, col 21)
at org.thymeleaf.spring5.expression.SPELVariableExpressionEvaluator.evaluate(SPELVariableExpressionEvaluator.java:290)
...
Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1008E: Property or field 'absentList' cannot be found on object of type 'java.util.ArrayList' - maybe not public or not valid?
at org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.java:217)
Заранее благодарю и буду рад любой помощи