web-dev-qa-db-ja.com

入力type = "date" thymeleaf

エンティティに日付を追加して、ユーザーがWebフォームで日付を設定できるようにする必要があります。このフィールドには、デフォルトで今日の日付が入力されている必要があります。

1. <input type="date" value="2016-08-01"> 

デフォルトに設定された正しい日付を表示します

2. <input type="date" th:value="${startDate}"> 

値のない日付ピッカーを示します(注:文字列startDate = "2016-08-01";)

3. <input type="date" th:field="${startDate}"> 

400エラー(不正なリクエスト)を生成します(注:Date startDate = new Date();)

だから、質問です:入力日付にthymeleafを使用する方法?

  • 入力にDate()データ型を使用して、そのようなデータを格納できますか?
  • 「th:field」をフォームに設定する方法
  • 「th:value」を同じ形式で設定する方法

私のコントローラー:

@RequestMapping("/project_new")
public String createProject(Model model) {
    Project project = new Project ();
    List<Role> roles = mRoleService.findAll();

    project.setStart(new Date());

    model.addAttribute("page_title", "create project");
    model.addAttribute("roles", roles);
    model.addAttribute("statuses", Status.values());
    model.addAttribute("project", project);
    return "project_new";
}

@RequestMapping(value = "/project_new", method = RequestMethod.POST)
public String createProject(@ModelAttribute Project project, Model model) {
    // Fill id field for project.rolesNeeded
    mRoleService.setRolesId(project.getRolesNeeded());
    project.fixCollaboratorsAndRoles();

    mProjectService.save(project);
    return "redirect:/";
}

私のテンプレート:

<form th:action="@{/project_new}" method="post" th:object="${project}">
  <div class="project-list single">
    <label for="name">Name:</label>
    <input type="text" id="name" required="true" th:placeholder="*{name}" th:value="*{name}" th:field="*{name}"/>
    <label for="description">Description:</label>
    <textarea rows="5" id="description" type="text"  required="true" th:placeholder="*{description}" th:value="*{description}" th:field="*{description}"/>

    <label for="date-started">Date started:</label>
    <input type="date" th:value="${project.start}" th:field="${project.start}" id="date-started"/>

    <div>
      <label for="project_status">Project Status:</label>
      <div class="custom-select">
        <span class="dropdown-arrow"></span>
        <select th:field="*{status}" id="project_status">
          <option th:each="s : ${statuses}" th:value="${s}" th:text="${s}">Active</option>
        </select>
      </div>
    </div>

  <div class="roles-collaborators">
    <ul class="checkbox-list">
      <li th:if="${role.name} ne 'Undefined'" th:each="role : ${roles}">
      <input type="checkbox"  th:value="${role}" th:field="${project.rolesNeeded}" class="checkbox"/>
      <span th:text="${role.name}" th:value="${role}" class="checkbox">Developer</span>
      </li>
    </ul>
  </div>

  <div class="actions">
    <button type="submit" class="button">Save</button>
    <a th:href="@{/}" class="button button-secondary">Cancel</a>
  </div>
</div>
</form>

プロジェクトエンティティ:

@Entity
public class Project {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@NotNull
@Size (min = 3)
private String name;

@Column(columnDefinition="TEXT")
private String description;

@Column
private Status status;

@Column
private Date start;

@ManyToMany
@LazyCollection(LazyCollectionOption.FALSE)
private List<Role> rolesNeeded;

@ManyToMany
@LazyCollection(LazyCollectionOption.FALSE)
private List<Collaborator> collaborators;

public Date getStart() {
    return start;
}

public void setStart(Date start) {
    this.start = start;
}
10
zzheads

エラーログのコメントを見ると、StringからJava.utilへの変換の問題のようです.Date。 Thymeleaf GitHubでしばらく検索したところ、この場合の対処方法を説明できる2つの問題が見つかりました。

  • この問題 の日付を含む変換の説明。
  • 変換の実装について説明します here

最後のポイントから、プロジェクトクラスの開始日に注釈を追加しました。

// This is "org.springframework.format.annotation.DateTimeFormat"
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date start;

その後、コントローラPOSTメソッドで日付を受け取ることができました。

$ {project.start}* {start}nameおよびdescriptionフィールド。

21
BitExodus

日付の代わりに文字列を使用

@DateTimeFormat(pattern = "yyyy-MM-dd")<br>
private String fromDate;
0
jais