Ситуация
Я использую приложение SpringBoot с шаблонизатором Thymeleaf.Я опубликовал упрощенную версию кода, который сейчас задействован.Контроллер добавляет атрибут в объект Model, а затем возвращает DeferredResult.В конце атрибуты формы модели используются в шаблоне Thymeleaf для отображения их на странице.
Проблема
Я знаю, не будет ли объект добавлен вмодель, которая выдаст исключение в шаблоне Thymeleaf из-за отсутствия защитного блока или th: if.Но я устанавливаю инициализированный объект перед выполнением любого кода.Я также записываю значение модели для целей отладки и всегда присутствует после расчета.Таким образом, модель с соответствующим ключом установлена, но в точке рендеринга тимелист ключ в модели возвращает нулевое значение.Это происходит только под большой нагрузкой.В производственной системе или при моделировании нагрузки с более чем 30 одновременными запросами.
Это происходит 1 ~ 2 раза в 100 запросах.
Я храню несколько объектов в модели.Они случайно равны нулю.
Я также попытался записать все значения с помощью следующего кода.Все остальные данные, по-видимому, в порядке и присутствуют, только один объект в приведенном ниже случае пропущен один - это "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");
}
Шаблон Thymeleaf
<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)