Как я могу решить проблему с несколькими макетами в Thymleaf? - PullRequest
0 голосов
/ 15 ноября 2018

Я получаю сообщение об ошибке, когда хочу ввести другой фрагмент из одной страницы макета, который содержит фрагменты. Один для заголовка, а другой для формы сообщения. Когда я включаю только первое, у меня возникает проблема, но если я добавляю другое, я получаю две ошибки.

Первый:

Error during execution of processor 'org.thymeleaf.spring4.processor.SpringInputGeneralFieldTagProcessor' (template: "fragments/header" - line 38, col 26)

Второй -

` ERROR 13400 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[.[dispatcherServlet]      
: Servlet.service() for servlet [dispatcherServlet] in context with path 
[/api] threw exception [Request processing failed; nested exception is 
org.thymeleaf.exceptions.TemplateProcessingException: Error during execution 
of processor 
'org.thymeleaf.spring4.processor.SpringInputGeneralFieldTagProcessor' 
(template: "fragments/header" - line 38, col 26)] with root cause

java.lang.IllegalStateException: Neither BindingResult nor plain target 
object for bean name 'tweet' available as request attribute`

Первый фрагмент - это панель навигации, а второй - пост-форма. Я использовал thymleaf и весенний ботинок.

header.html:

<!DOCTYPE html >
<html xmlns:th="http://www.thymeleaf.org">
<head>
 ...
</head>
<body>
<div class="navbar navbar-inverse navbar-fixed-top" th:fragment="header">
<div class="container">
<div class="navbar-header">
  <a class="navbar-brand" href="#"><strong>Twitter</strong></a>
</div>
<div class="navbar-collapse collapse">
  <ul class="nav navbar-nav">
    <li th:classappend="${module == 'home' ? 'active' : ''}">
      <a href="#" th:href="@{/}">My tweets</a>
    </li>
    <li th:classappend="${module == 'tasks' ? 'active' : ''}">
      <a href="#" th:href="@{/new}">Create a User</a>
    </li>
    <li th:classappend="${module == 'tasks' ? 'active' : ''}">
      <a href="#" th:href="@{/tweets}">Tweets</a>
    </li>
    <li th:classappend="${module == 'tasks' ? 'active' : ''}">
      <a href="#" th:href="@{/all}">Display all Users</a>
    </li>
    <li th:classappend="${module == 'tasks' ? 'active' : ''}">
      <a href="#" th:href="@{/overview}">Profile overview</a>
    </li>
  </ul>
</div>
</div>
</div>
<div th:fragment="post">
 <!--/*@thymesVar id="tweet" 
 type="com.javalanguagezone.interviewtwitter.domain.Tweet"*/-->
<form th:action="@{/tweets/}" th:object="${tweet}" method="post">
  <div class="form-group">
  <input type="text" th:field="*{content}" placeholder="What's happening? 
Tell us!">+
  <input type="submit" value="Submit" />
  </div>
</form>
</div>
</body>
</html>

HTML-файл, в котором я вызываю фрагменты макета, выглядит следующим образом:

    <!DOCTYPE html>
   <html lang="en"  xmlns:th="http://www.thymeleaf.org">
   <head><meta charset="UTF-8">
    <title>User overview</title>
   </head>
  <body>
  <div th:replace="fragments/header :: header"></div>
  <div th:replace="fragments/header :: post"></div>

 <div class="container-fluid" style="margin-top: 80px">
 <div class="row">
   <div class="col-md-12">
  <div class="panel panel-primary">

    <div class="panel-heading">
      <h1 class="panel-title">User profile overview</h1>
    </div>
    <div class="panel-body">
      <div class="table-responsive" th:if="${tweets}!=null">
        <table class="table table-hover">
          <thead>
          <tr>
            <th>Id</th>
            <th>Name</th>
            <th>Number of tweets</th>
            <th>Number of followers</th>
            <th>Number of users following</th>
          </tr>
          </thead>
          <tbody>
          <tr>
            <td th:text="${user.id}"></td>
            <td th:text="${user.getUsername()}"></td>
            <td th:text="${tweets}">1</td>
            <td th:text="${followers}">Hamdo</td>
            <td th:text="${following} "><br/>

            </td>
            </span>
          </tr>
          </tbody>
        </table>
      </div>
    </div>
  </div>
   </div>
  </div>
  </div>
  </body></html>

Контроллер выглядит так:

 @PostMapping("/")
 @ResponseStatus(CREATED)
 public String tweet(@ModelAttribute("tweet") @Valid @RequestBody String 
 tweet, Principal principal, BindingResult result) {
 if(result.hasErrors()){
  return "error";
 }
   tweetService.createTweet(tweet, principal);

  return "index";
  }

Заранее спасибо за помощь, и я новичок с Thymleaf.

1 Ответ

0 голосов
/ 15 ноября 2018

Вы можете попробовать передать объект tweet как переменную в ваш фрагмент с помощью следующего кода.

<div th:replace="fragments/header :: post" th:with="tweetFrag = ${tweet}"></div>

Затем просто используйте новую переменную.

<form th:action="@{/tweets/}" th:object="${tweetFrag}" method="post">
  <div class="form-group">
  <input type="text" th:field="*{content}" placeholder="What's happening? Tell us!">+
  <input type="submit" value="Submit" />
  </div>
</form>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...