Нижний колонтитул SpringMVC Thymeleaf не находит контроллер
У меня есть проект весенней загрузки, который использует SpringMVC и Thymeleaf. У меня есть нижний колонтитул, определенный в layout.html, который включен в каждую страницу. В любом случае нужно включить вызов в том нижнем колонтитуле, который показывает "статус" для каждой страницы. Таким образом, когда вы перемещаетесь по сайту, нижний колонтитул страницы всегда будет показывать нужную информацию?
У меня есть REST Controller, который помещает объект Status:
@Controller
public class StatusController {
@RequestMapping(value = "/status", method = RequestMethod.GET)
public String get(Model model) {
Status status = new Stauts;
LocalDate lastUpdate = statusRepository.findByLastUpdate();
...
// do some work to update the status object
model.addAttribute( STATUS, status );
return "status";
}
У меня есть в моем footer.html это определено:
<div th:fragment="foot">
<div id="footer">
<div class="container">
<p class="muted credit">
<form action="refreshData" th:action="@{/status}" method="get"></form>
Last update status: <span th:text="${status.status}" class="text-info"></span>
</p>
</div>
</div>
</div>
И тогда каждая страница включает нижний колонтитул как таковой:
...
<div th:include="layout :: foot"></div>
</body>
Я установил точку останова в моем контроллере, и она не вызывается, и я всегда получаю это исключение при загрузке страницы:
org.springframework.expression.spel.SpelEvaluationException: EL1007E: (pos 0): свойство или поле 'status' не может быть найдено в null
Интересно, контроллер никогда не вызывается, потому что я должен использовать что-то вроде jQuery для выполнения вызовов Ajax, или потому что у меня есть это в моем layout.html, и это включает в себя не делать вызовы (что кажется маловероятным)?
2 ответа
В Spring MVC у вас есть только один контроллер на страницу / вызов. Вы не можете вызвать несколько контроллеров за один выстрел. Я считаю, что это ваша проблема.
У вас есть несколько возможностей:
Либо вы должны включить эту переменную состояния в каждый контроллер самостоятельно.
создать ControllerAdvice, который подготавливает статус атрибута модели и применяется к каждому контроллеру (по умолчанию)
используйте вызов службы в нижнем колонтитуле, чтобы получить статус, например: th:text="${@statusService.status}"
Мне для себя нравится сервисный подход для такой глобальной доступной информации.
ТОК:
<span th:text="${status.status}" class="text-info">
ИЗМЕНИТЬ В
<span th:text="${status}" class="text-info">
это будет отображать ноль
в контроллере вы установили Status status = null; и установите его в карте модели для атрибута status". Таким образом, ${status} оценивается как нулевой (это не что иное, как model.get("status")). ${status.status} будет иметь значение null.status. В результате "статус" не может быть найден на нуле