Thymeleaf Spring MVC页脚没有#39;找到Controller

时间:2014-10-09 13:29:46

标签: spring-mvc spring-boot thymeleaf spelevaluationexception

我有一个使用SpringMVC和Thymeleaf的春季启动项目。我在每个页面上都包含layout.html中定义了一个页脚。无论如何,在该页脚上包含一个显示" status"对于每个页面。这样,当您浏览网站时,页脚将始终显示所需的信息?

我有一个REST控制器,它放置一个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):属性或字段&#39; status&#39;在null

上找不到

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

2 个答案:

答案 0 :(得分:1)

在Spring MVC中,每页/呼叫只有一个控制器。您无法一次性调用多个控制器。我相信这是你的问题。

您有多种可能性:

  • 您必须自己在每个控制器中加入此状态变量。

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

  • 在您的页脚中使用服务调用来获取状态,如:th:text =&#34; $ {@ statusService.status}&#34;

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

答案 1 :(得分:0)

电流:

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

改变

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

这将显示null

在控制器中

设置Status status = null;并在模型映射中将其设置为属性状态“。 所以$ {status}被评估为null(这只是model.get(“status”))。 $ {status.status}将为null.status。 导致 无法在null

上找到'status'