情况
我在Thymeleaf模板引擎中使用SpringBoot应用程序。我发布了所涉及代码的简化版本。控制器将一个属性添加到Model对象,然后返回DeferredResult。最后,在Thymeleaf模板中使用模型的属性将其呈现在页面上。
问题
我知道如果不将对象添加到模型中,由于缺少保护块或th:if,它将在Thymeleaf模板中引发异常。但是我在执行任何代码之前设置初始化对象。我还记录了模型的值以用于调试目的,并且该值在计算后始终存在。因此设置了具有适当键的模型,但是在渲染百里香的时候,模型中的键返回空值。这仅在重负载下发生。在生产系统中或在模拟具有30个以上并发请求的负载时。
在100个请求中发生1〜2次。
我在模型中存储了多个对象。它们随机为空。
我还尝试使用以下代码记录所有值。所有其他数据似乎都很好并且存在,在下面缺少一个的情况下,只有单个对象是“ model_key”。
<table id="model-attributes">
<tr th:each="var : ${#vars}">
<td th:text="${var.key}"></td>
<td th:text="${var.value}"></td>
</tr>
</table>
问题
其他人也遇到过类似的问题吗?可能是Thymeleaf缓存问题吗?
代码
控制器
@GetMapping(value = "/path")
public DeferredResult<String> processRequest(Model model) throws Exception {
// To make sure the model is not null add it already before any computation
model.addAttribute("model_key", new ModelValue());
ModelValue modelValue = calculateModel();
// For debugging purposes
log("Model Value " + modelValue);
// Add the actual model
if(modelValue != null) {
model.addAttribute("model_key", modelValue);
} else {
log.error("Model was empty");
}
deferredResult.setResult("template_name");
}
胸腺模板
<p th:text="${model_key.id}">
异常日志
2018-11-12T07:45:28.691Z ERROR org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/].[dispatcherServlet] [http-nio-8080-exec-6] : Servlet.service() for servlet dispatcherServlet threw exception
org.springframework.expression.spel.SpelEvaluationException: EL1007E: Property or field 'id' cannot be found on null
at org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.java:220)
org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.java:94)