web-dev-qa-db-ja.com

Thymeleaf登録ページ-プロセッサー「org.thymeleaf.spring4.processor.attr.SpringInputGeneralFieldAttrProcessor」の実行中にエラーが発生しました

ウェブサイトの登録ページを作成しています。新しいユーザーを作成するにはIDが必要であるため、次のフィールドがあることを理解しています。

<input type="hidden" th:field="{*id} />

しかし、ページに移動すると、この投稿のタイトルで述べたエラーが表示されます。

問題のフォームは次のとおりです。

<form th:action="@{/users/register}" th:object="${user}" class="form-signin" method="POST">
    <h2 class="form-signin-heading">Register</h2>
    <input type="hidden" th:field="*{id}" />
    <label for="inputUsername" class="sr-only">Username*</label>
    <input type="text" th:field="*{username}" name="username" id="inputUsername" class="form-control" placeholder="Username" required="required" autofocus="autofocus" />
    <label for="inputEmail" class="sr-only">Email Address*</label>
    <input type="text" th:field="*{email}" name="email" id="inputEmail" class="form-control" placeholder="Email address" required="required" autofocus="autofocus" />
    <label for="inputPassword" class="sr-only">Password</label>
    <input type="password" th:field="*{password}" name="password" id="inputPassword" class="form-control" placeholder="Password" required="required" />
    <label for="inputConfirmPassword" class="sr-only">Confirm Password</label>
    <input type="password" th:field="${confirmPassword}" name="confirmPassword" id="inputConfirmPassword" class="form-control" placeholder="Confirm password" required="required" />
    <button class="btn btn-lg btn-primary btn-block" type="submit">Register</button>
</form>

これが私のUserControllerです:

@RequestMapping("/register")
public String registerAction(Model model) {
    model.addAttribute("user", new User());
    model.addAttribute("confirmPassword", "");
    return "views/users/register";
}

@RequestMapping(value="/register", method = RequestMethod.POST)
public String doRegister(User user) {
    User savedUser = userService.save(user);
    return "redirect:/"; //redirect to homepage
}

そして、Userエンティティの最初の部分:

@Entity
@Table(name = "users")
public class User {

// Default constructor require by JPA
public User() {}

@Column(name = "id")
@Id @GeneratedValue
private Long id;

public void setId(long id) {
    this.id = id;
}

public long getId() {
    return id;
}

私が見ることができるものから、ここには何も問題がないので、行き詰まっています。

私はこの例に従っています: https://github.com/cfaddict/spring-boot-intro

何か案は?

6
MC123

問題は、idプロパティの宣言方法です。フィールドはnullである参照型Longを使用します。ゲッターはプリミティブlongを使用します。 Springがidフィールドにアクセスすると、null値をunboxしようとしてエラーが発生します。ドメインクラスを次のように変更します

@Entity
@Table(name = "users")
public class User {

    // Default constructor required by JPA
    public User() {}

    @Id
    @Column(name = "id")
    @GeneratedValue
    private Long id;

    public void setId(Long id) {
        this.id = id;
    }

    public Long getId() {
        return id;
    }
}
3
ekem chitsiga

このようなクラスがあるかどうかわかりません

_@Controller
@RequestMapping("/users")
public class MyController{

    @RequestMapping("/register")
    public String registerAction(Model model) {
        model.addAttribute("user", new User());
        model.addAttribute("confirmPassword", "");
        return "views/users/register";
    }

    @RequestMapping(value="/register", method = RequestMethod.POST)
    public String doRegister(User user) {
        User savedUser = userService.save(user);
        return "redirect:/"; //redirect to homepage
    }
}
_

@RequestMapping("/users")がない場合、これは問題です。クラスにこのアノテーションがない場合、thymeleaf templaceの正しいアクションは "@ {/ register}"でなければなりません。つまり、投稿したメソッドでエンドポイントを公開すると、次のようなテンプレートが必要になります。

_<form th:action="@{/register}" th:object="${user}" class="form-signin" method="POST">
    <h2 class="form-signin-heading">Register</h2>
    <input type="hidden" th:field="*{id}" />
    .... should be as you written
    <input type="password" th:field="*{confirmPassword}" id="inputConfirmPassword" class="form-control" placeholder="Confirm password" required="required" />
    <button class="btn btn-lg btn-primary btn-block" type="submit">Register</button>
</form>
_

hTMLをよく読んで、th:field = "$ {confirmPassword}"ではなく、おそらくth:field = "* {confirmPassword}"が必要です。もう1つは、私の意見ではうまくいかないと思うのは、名前属性を繰り返すことです。私のアドバイスは繰り返さないで、データバインディング用の正しい属性を構築する作業を説明することです。

2
Valerio Vaudi