Нижний колонтитул 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. В результате "статус" не может быть найден на нуле

Другие вопросы по тегам