Представление Thymeleaf не может найти свойство / поле запроса jOOQ join

#java #spring #thymeleaf #jooq #spelevaluationexception

#java #весна #thymeleaf #jooq #исключение spelevaluationexception

Вопрос:

Я новичок в работе с Spring, Thymeleaf и jOOQ. Я хочу отобразить результаты поиска в базе данных в обзоре. Когда я просто запрашиваю select().from(КОНФИГУРАЦИИ), представление Thymeleaf работает просто отлично. Но когда я хочу присоединиться к таблице User, чтобы добавить имя пользователя к результатам вместо просто идентификатора, я получаю сообщение об ошибке.

Это ошибка в веб-браузере:

Пн Окт 10 16:04:17 CEST 2016 Произошла непредвиденная ошибка (тип = внутренняя ошибка сервера, статус = 500). Исключение, оценивающее выражение SpringEL: «config.name » (общий обзор:37)

Это ошибка в Eclipse:

org.springframework.expression.spel.Исключение SpelEvaluationException: EL1008E: (поз. 7): свойство или поле ‘name’ не могут быть найдены для объекта типа ‘org.jooq.impl.RecordImpl’ — может быть, не является общедоступным?

Я понимаю, что мой код представления неверен, но я не знаю, что мне следует изменить «config.name » чтобы получить нужное свойство.поле.

Это мой контроллер:

 @Controller
public class OverviewController
{
    public ArrayList configurationList = new ArrayList();

    @RequestMapping("/overview")
    public String showConfigurationList(Model model) 
    {
        model.addAttribute("configs", getConfigurations());
        return "overview";
    }

    public ArrayList getConfigurations()
    {
        try (Connection conn = DriverManager.getConnection(dbUrl, dbUserName, dbPassword)) 
        {
            DSLContext create = DSL.using(conn, SQLDialect.POSTGRES_9_5);
            Result<Record5<String, String, Timestamp, String, String>> result = create.select(CONFIGURATION.NAME, CONFIGURATION.VERSION, CONFIGURATION.DATE_MODIFIED, CONFIGURATION.AUTHOR_USER_ID, USER.NAME)
                    .from(USER).join(CONFIGURATION)
                    .on(CONFIGURATION.AUTHOR_USER_ID.equal(USER.ID)))
                    .fetch();
            /*Result<Record> result = create.select()
                    .from(CONFIGURATION)
                    .fetch();*/

            if(configurationList.isEmpty() == true)
            {
                for (Record5 r : result) {                  
                configurationList.add(r);
                }
            }               
        }             
        catch (Exception e) 
        {
            System.out.println("ERROR: "   e);          
        }
        return configurationList;
    }
  

И это представление Thymeleaf:

 <!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org">
<head>
  <title>Nazza Mediator - Overview</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <link rel="stylesheet" href="webjars/bootstrap/3.3.7-1/css/bootstrap.min.css" />
    <script src="http://code.jquery.com/jquery.js" />
    <script src="webjars/bootstrap/3.3.7-1/js/bootstrap.min.js" />
</head>

<body>
<nav class="navbar navbar-default">
  <div class="container-fluid">
    <div class="navbar-header">
      <a class="navbar-brand" href="/">Nazza Mediator</a>
    </div>
    <ul class="nav navbar-nav">
      <li><a href="/">Home</a></li>
      <li class="active"><a href="/overview">Configuration Overview</a></li>
    </ul>
  </div>
</nav>

    <h3>Configuration Overview</h3>

    <table class="table table-hover">
      <tr>
        <th>NAME</th>
        <th>VERSION</th>
        <th>DATE MODIFIED</th>
        <th>AUTHOR</th>
      </tr>
      <tr th:each="config : ${configs}">
        <td th:text="${config.name}"></td>
        <td th:text="${config.version}"></td>
        <td th:text="${config.dateModified}"></td>
        <td th:text="${config.authorUserId}"></td>
      </tr>
    </table>
  </body>

</html>
  

Ответ №1:

Я предполагаю, что у вас запущен и запущен генератор кода jOOQ.

Итак, когда вы используете первый select

 Result<Record> result = create.select()
                .from(CONFIGURATION)
                .fetch();
  

На самом деле вы получите, Result<ConfigurationRecord> и у этого есть средство доступа getName , которое может использоваться Thymeleaf.

Если вы запишете соединение и добавите поля вручную, у вас будет общая запись, реализация, которая предоставляет только #get(String fieldName) и некоторые другие.

По вашему мнению, вы должны изменить доступ к значениям следующим образом

 <td th:text="${config.get('NAME')}"></td>
  

Вы должны сделать это для каждого поля.

Но будьте осторожны, в вашем запросе у вас есть два поля с именем «name», я думаю, вам следует использовать псевдоним одного из них. Например, USER.NAME.as('userName') и используйте это в вызове get.

Дайте мне знать, если это поможет.

Еще одно редактирование: Лукас Эдер из jOOQ спросил, можно ли его использовать config['NAME'] : это невозможно для общей записи, но только для конкретной. Кроме того, во всех случаях, когда вы ссылаетесь на имя поля, вы должны быть осторожны, потому что оно чувствительно к регистру.

Комментарии:

1. Да, это сработало! Спасибо за решение, а также большое спасибо за объяснение, теперь я понимаю, почему мой код не работал.