【问题标题】:Thymeleaf SpringMVC page footer doesn't find ControllerThymeleaf SpringMVC 页面页脚找不到控制器
【发布时间】:2014-12-04 11:02:19
【问题描述】:

我有一个使用 SpringMVC 和 Thymeleaf 的 Spring Boot 项目。我在包含在每个页面上的 layout.html 中定义了一个页脚。无论如何要在该页脚上包含一个显示每个页面的“状态”的调用。这样当您浏览网站时,页脚总是会显示所需的信息?

我有一个放置状态对象的 REST 控制器:

@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): 在 null 上找不到属性或字段“状态”

我想知道控制器是否永远不会被调用,因为我必须使用像 jQuery 这样的东西来进行 Ajax 调用,或者因为我的 layout.html 中有这个并且包含不调用(这似乎不太可能)?

【问题讨论】:

    标签: spring-mvc spring-boot thymeleaf spelevaluationexception


    【解决方案1】:

    在 Spring MVC 中,每个页面/调用只有一个控制器。您不能一次调用多个控制器。我相信这是你的问题。

    您有多种可能性:

    • 您必须自己将此状态变量合并到每个控制器中。

    • 创建一个ControllerAdvice,准备模型属性状态并应用于每个控制器(默认)

    • 在页脚中使用服务调用来获取如下状态:th:text="${@statusService.status}"

    我自己喜欢这种全球可用信息的服务方法。

    【讨论】:

    • 谢谢你,Martin,我创建了一个状态服务,它只返回一个状态对象以供页面读取。这似乎工作得很好,但我想知道是否有更清洁的方法来做到这一点。感觉就像我正在跨越边界之类的。也许我只是对这个简单的解决方案的效果感到惊讶:) 无论如何,感谢您提供快速而有用的建议。
    • 您可以引入自定义的“服务”注释,如“UIService”,并将这些服务仅保留在 servlet 上下文中。这有助于为我识别此类服务。
    【解决方案2】:

    当前:

    <span th:text="${status.status}" class="text-info">
    

    改成

    <span th:text="${status}" class="text-info">
    

    这将显示为空

    在控制器中你设置了 Status status = null;并将其在模型映射中设置为属性状态”。 所以 ${status} 被评估为 null(这不过是 model.get("status"))。 ${status.status} 将是 null.status 。 导致 在 null 上找不到“状态”

    【讨论】:

    • 此处解释更改的原因会很有用
    • 但是控制器永远不会被调用,因此状态对象永远不会返回。我将更新我的问题以显示状态对象在返回之前已实例化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 2017-10-18
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多