Spring Boot + LocalDate: "Нет основного или конструктора по умолчанию"

Я создал простую форму с <input type="date" ...> для приложения Spring Boot. Я бы хотел, чтобы это превратилось в LocalDate в контроллере. Я получаю ошибку:

Fri Aug 17 15:32:01 CEST 2018
There was an unexpected error (type=Internal Server Error, status=500).
No primary or default constructor found for class java.time.LocalDate

Это, безусловно, правильно, но - насколько я понимаю - не должно иметь значения, потому что, согласно документации: "[...] @DateTimeFormat аннотация должна работать с java.time на Java 8 и Spring 4."

Контроллер метод:

@PostMapping("/users")
public String register(String user, String pw, @DateTimeFormat(iso=DateTimeFormat.ISO.DATE) LocalDate beginning){

    MyUser myUser = MyUser.create(user,pw);
    MyUser.setEnabled(beginning);

    repo.register(myUser);

    return "redirect:/users/"+user;
}

HTML /thymeleaf:

<form method="POST">
<div><label> Benutzername : <input type="text" name="user"/> </label></div>
<div><label> Passwort: <input type="password" name="password"/> </label></div>
<div><label> Freigeschaltet ab (optional): <input type="date" name="beginning"/> </label></div>
<div><input type="submit" value="Registrieren"/></div>
</form>

пом (выдержка)

 <dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.0.4.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
...
</dependencies>   

<properties>
    <java.version>1.8</java.version>
</properties>

Изменить: полный HTML

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
  xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
<head>
<title>Users</title>
</head>
<body>

<div th:insert="fragments :: logoutButton">...</div>

<div class ="user_list">
<h2>Registrierte Nutzer</h2>

<div>
<table border="1">
    <tr>
        <td>Name</td>
        <td>Freigeschaltet ab</td>
        <td>Freigeschaltet bis</td>
        <td>Passwort gesetzt</td>
        <td>Freigaben</td>
    </tr>
    <tr th:each="user : ${users}">
        <td th:text="${user.userName}"/>
        <td th:text="${user.enabled}"/>
        <td th:text="${user.disabled}"/>
        <td th:text="${user.pwSet}"/>
        <td th:text="${user.authorities}"/>
    </tr>
</table>
</div>
</div>

<div class ="register_user">
<h2>Neuen Benutzer Registrieren</h2>

<form method="POST">
<div><label> Benutzername : <input type="text" name="user"/> </label>    </div>
<div><label> Password: <input type="password" name="password"/> </label></div>
<div><label> Freigeschaltet ab (optional): <input type="date" name="beginning"/> </label></div>
<div><input type="submit" value="Registrieren"/></div>
</form>
</div>
</body>
</html>

1 ответ

Решение

LocaDate не предоставляет собственного конструктора, но создается с использованием статического вызова метода.

Это было решено в SPR-13362 и работает как ожидалось. Обходной путь должен создать атрибут модели, используя @ModelAttribute аннотация и передача его на запрос:

@ModelAttribute
LocalDate initLocalDate() {
    return LocalDate.now();
}

И передайте его тогда на запрос:

@PostMapping("/users")
public String register(
    String user, 
    String pw,  
    @DateTimeFormat(iso=DateTimeFormat.ISO.DATE)  @ModelAttribute LocalDate beginning) 
{
    // ...
}
Другие вопросы по тегам