0

Применение бросков org.springframework.expression.spel.SpelEvaluationException: EL1007E: (поз 0): Свойство или поле «Название» не может быть найден на нульSpring/Thymeleaf: свойство или поле 'title' не найдено на null. Зачем?

, и я не могу понять, почему ... Вот 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> 

Однако, когда приложение запущено, название поля не равно нулю! Здесь мы имеем отображение fot объекта 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; 
} 

В качестве доказательства мы можем видеть, что названия при обследованиях печатаются на консоли: Console output

И они присутствуют в базе данных Surveys Database

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

Заранее благодарю вас за помощь.

EDIT: По предложению я попытался напечатать объект $ {surv}. Я изменил атрибут «surv-ct» внутреннего div от ID к классу, так как они предполагаются многими.

<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 
     --> 

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

+1

Что-то я хотел бы сделать, чтобы отладить это было бы удалить '[[$ {surv.title}]]' некоторое время, и вместо того, чтобы печатать только '$ {Surv}' где-нибудь. Таким образом, вы увидите, какие опросы являются нулевыми (поскольку одно или несколько опросов являются нулевыми, а не названиями), если размер списка опросов является точным и т. Д. –

+0

Обычно заголовок должен быть текстовым, но в вашем случае, похоже, текст в вложенном массиве. –

+0

Нет, это обозначение javascript-тимелеар (по-видимому). [См. Здесь] (http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf.HTML # скрипт-встраивание-на JavaScript и-дротик) –

ответ

2

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

В то время как й: включает в себя будут включать в себя содержимое фрагмента в принимающей теге я: заменить фактически заменит хозяин тег, фрагмент

Это означает, что ваш 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>