Spring / Thymeleaf: свойство или поле «название» не может быть найдено с нулевым значением. Почему?

Приложение выдает исключение org.springframework.expression.spel.SpelEvaluationException: EL1007E:(pos 0): свойство или поле «название» не может быть найдено с нулевым значением

и я не могу понять, почему... Вот фрагмент html, вызванный мастером.

<title th:fragment="title">Surveys Feed</title>
<div th:fragment="content" th:each="surv : ${allSurveys}" >
    <div id="surv-ct" style="min-width: 310px; max-width: 800px;     height:400px; margin: 0 auto">
    <script th:inline="javascript">
       /*<![CDATA[*/
           $('#surv-ct').highcharts({
               chart: {
                   type: 'bar'
               },
               title: {
                   text: [[${surv.title}]]
               },
             // ... other stuff 
    </script>
  </div>
</div>

Тем не менее, когда приложение запускается, заголовок поля не равен нулю! Здесь у нас есть сопоставление для объекта allSurveys, который берет все опросы из репозитория и возвращает список.

@ModelAttribute("allSurveys")
public List<Survey> allSurveys() {
    List<Survey> surveys = new Surveys(repo.findAll()).getSurveys();
    // print surveys titles
    for (int i = 0; i < surveys.size(); i++) {
        Survey sur = surveys.get(i);
        System.out.println("Survey info: " + sur.getTitle());
    }
    return surveys;
}

В качестве доказательства мы можем видеть, что заголовки опросов печатаются на консоли: Консольный вывод

И они ПРИСУТСТВУЮТ в базе данных База данных опросов

Так почему он говорит, что это ноль? Я видел разные ответы в Интернете, но ни один из них не является решением для моего случая.

Спасибо заранее за вашу помощь.

РЕДАКТИРОВАТЬ: По предложению я попытался распечатать объект ${surv}. Я изменил атрибут "surv-ct" внутреннего div с идентификатора на класс, так как предполагается, что их много.

<div th:fragment="content" th:each="surv : ${allSurveys}" >
    <div class="surv-ct" style="min-width: 310px; max-width: 800px; height: 400px; margin: 0 auto">
        <p>Object is: <span th:text=${surv}>obj</span></p>
        <!--
        <script th:inline="javascript">
           /*<![CDATA[*/

               $('.surv-ct').highcharts({
                   chart: {
                       type: 'bar'
                   },
                   // ... more code
    -->
    </div>
</div>

Когда я анализирую код в Mozilla, вот результат.

    <p>Object is: <span></span></p>
    <!--
    <script th:inline="javascript">
       /*<![CDATA[*/
           $('.surv-ct').highcharts({
                // ... more code that i deleted
                // it's commented anyway
      -->

Во-первых, печатается только один результат. А во-вторых, он не получает никакого объекта наблюдения. Вот почему поле «заголовок», я думаю, пустое. Так почему тогда объект нулевой? Любое предложение?


person Community    schedule 07.01.2016    source источник
comment
Что-то, что я сделал бы, чтобы отладить это, было бы удалить [[${surv.title}]] на некоторое время и вместо этого напечатать только ${surv} где-нибудь. Таким образом, вы увидите, какие опросы являются нулевыми (потому что один или несколько опросов являются нулевыми, а не названия), если размер списка опросов точен и т. д.   -  person Michal M    schedule 07.01.2016
comment
Обычно заголовок должен быть текстом, но в вашем случае это текст во вложенном массиве.   -  person Sebastian Bochan    schedule 07.01.2016
comment
Нет, это нотация javascript-thymeleaf (очевидно). см. здесь   -  person    schedule 07.01.2016


Ответы (1)


Я подозреваю, что это потому, что вы используете th:include, когда используете фрагмент. Согласно документации Thymeleaf :

В то время как th:include включит содержимое фрагмента в свой тег хоста, th:replace фактически заменит тег хоста тегом фрагмента.

Это означает, что ваш th:each будет просто проигнорирован, что объясняет, почему вы видите только один напечатанный результат.

Решение состоит в том, чтобы использовать th:replace, который будет использовать th:if. Или вы можете немного изменить формат вашего фрагмента, чтобы th:each был частью содержимого фрагмента. например:

<th:block th:fragment="content">
    <div th:each="surv : ${allSurveys}">
        <div id="surv-ct" style="min-width: 310px; max-width: 800px;     height:400px; margin: 0 auto">
            <script th:inline="javascript">
               /*<![CDATA[*/
                   $('#surv-ct').highcharts({
                       chart: {
                           type: 'bar'
                       },
                       title: {
                           text: [[${surv.title}]]
                       },
                     // ... other stuff 
            </script>
        </div>
    </div>
</th:block>
person Andrew    schedule 16.01.2016