我有一个使用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中有这个并且包括不进行调用(这似乎不太可能)?
答案 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'