前提・実現したいこと
現在Javaを使用して掲示板を作製しています。
トップ画面にユーザー登録画面への遷移するボタンを設置し、ユーザー登録を行う機能を実装しようとした所、登録ボタンを押した際に
以下のエラーが発生しています。
DBの内容は以下の記事を参考にしています。
https://takurog.org/bbs-lesson-2/
発生している問題・エラーメッセージ
Web画面上
Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback. Sat Jun 27 15:25:04 JST 2020 There was an unexpected error (type=Internal Server Error, status=500). Exception evaluating SpringEL expression: "#fields.hasErrors('display_name')" (template: "register" - line 24, col 14)
Eclipsコンソール上での表示↓
https://github.com/shinnuko/error_log/blob/master/test
該当のソースコード
register.html
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="register.css"> <title>ユーザー登録画面はこちら</title> </head> <body> <header> <div class="header-logo"> <!-- ① --> <a href="/">フォーム画面へ</a> <a class="header-right" href="/login">ログイン</a> </div> </header> <div> <form th:action="@{/register}" action="/register" th:object="${register}" method="post"> <h1>ユーザー登録</h1> <div th:classappend="${#fields.hasErrors('display_name')}? 'has-error'"> <label for="display_name">アカウント名</label> <div> <input id="display_name" type="text" th:field="*{display_name}" name="display_name"/> <span th:if="${#fields.hasErrors('display_name')}" th:errors="*{display_name}">error!</span> </div> </div> <div th:classappend="${#fields.hasErrors('password')}? 'has-error'"> <label for="password">パスワード</label> <div> <input id="password" type="password" th:field="*{password}" name="password"/> <span th:if="${#fields.hasErrors('password')}" th:errors="*{password}">error!</span> </div> </div> <input type="submit" value="新規登録"/> </form> </div> </body> </html>
RegisterController.java
package com.example.demo.controller; import javax.validation.Valid; import org.springframework.stereotype.Controller; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import com.example.demo.dto.RegisterDto; @Controller public class RegisterController { @PostMapping public String create(@Valid @ModelAttribute RegisterDto registerDto, BindingResult bindingResult) { // ② if(bindingResult.hasErrors()) return "register"; // ③ registerDtosave(registerDto); return "redirect:/register"; } private void registerDtosave(@Valid RegisterDto registerDto) { // TODO 自動生成されたメソッド・スタブ } @ModelAttribute public RegisterDto setupForm() { return new RegisterDto(); } @RequestMapping(value="register") public String registerDto() { return "register"; } }
RegisterDto.java
package com.example.demo.dto; import java.io.Serializable; import lombok.Data; @Data public class RegisterDto implements Serializable { private static final long serialVersionUID = 1L; private String display_name; private String password; private String confirmPassword;//確認用パスワード public Object getDisplay_name() { // TODO 自動生成されたメソッド・スタブ return null; } public void setDisplay_name(Object display_name) { // TODO 自動生成されたメソッド・スタブ } }
RegisterprocessDto.java
package com.example.demo.dto; import java.io.Serializable; import java.util.Date; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; import lombok.Data; @Entity @Table(name = "users") @Data public class RegisterprocessDto implements Serializable { @Id @GeneratedValue private Integer user_id; @Column(nullable=false) @NotNull // (1)対象のフィールドがnullでないことを示すjavax.validation.constraints.NotNullを付ける。 @Size(min = 1, max = 20) // (2)対象のフィールドの文字列長が指定したサイズの範囲内にあることを示す private String display_name; @Column(nullable=false, length=20) @NotNull @Size(min = 8)// 入力必須 8文字以上 confirmPasswordと同じ値であること private String password; @Column(nullable=false, updatable=false) private Date created_at; @Column(nullable=false) private Date updated_at;
RegisterReposaitory.java
package com.example.demo.dao; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import com.example.demo.dto.RegisterprocessDto; @Repository public interface RegisterRepository extends JpaRepository<RegisterprocessDto, Integer> { }
RegisterServise.java
package com.example.demo.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.BindingResult; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import com.example.demo.dao.RegisterRepository; import com.example.demo.dto.RegisterDto; import com.example.demo.dto.RegisterprocessDto; @Service @Transactional public class RegisterService { @Autowired RegisterRepository registerRepository; @Autowired PasswordEncoder passwordEncoder; public RegisterprocessDto create(RegisterprocessDto registerprocessDto , String rawPassword) { String encodedPassword = passwordEncoder.encode(rawPassword); registerprocessDto.setPassword(encodedPassword); return registerRepository.save(registerprocessDto); } @Autowired RegisterService registerService; @RequestMapping(value = "/register", method = RequestMethod.POST) String create(@Validated RegisterDto form, BindingResult bindingResult) { if (bindingResult.hasErrors()) { return "registerDto"; } RegisterDto register = new RegisterDto (); register.setDisplay_name(form.getDisplay_name()); RegisterService.create(register, form.getPassword()); return "redirect:/complete"; } private static void create(RegisterDto register, String password) { } @RequestMapping(value = "/complete", method = RequestMethod.GET) String createFinish() { return "accountcomplete"; } }
WebSecurityConfig.java
package com.example.demo.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.builders.WebSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; @Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override public void configure(WebSecurity web) throws Exception { web.ignoring().antMatchers("/","/css/**", "/datepicker/**", "/img/**"); } @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() // 認証が必要となるURLを設定します .antMatchers("/login/").permitAll() // /loginFormは認証不要 .antMatchers("/register/").permitAll() .antMatchers("/thread/").permitAll() // /thread以下のURLも認証不要 .anyRequest().authenticated(); // それ以外はすべて認証された状態じゃなきゃダメ } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); //パスワードのハッシュ化でBCryptを使う } }
試したこと
Exception evaluating SpringEL expression: "#fields.hasErrors('display_name')" (template: "register" - line 24, col 14)
以下を参考にregister.htmlの24行目↓ をチェック。※全角のインデントが混入していなか?””等の抜けが無いか?
<div th:classappend="${#fields.hasErrors('display_name')}? 'has-error'">
補足情報(FW/ツールのバージョンなど)
Java SE8
Eclips Version: 2020-03 (4.15.0)
SpringBoot
Mysql8.0
登録、ログイン機能参考記事↓
https://ti-tomo-knowledge.hatenablog.com/entry/2018/06/09/201419
https://ti-tomo-knowledge.hatenablog.com/entry/2018/06/11/205652
参考記事からの名称変更や設定部分
ユーザデータを登録する処理用のController作成
※RegisterControllerの名称に変更して作成しています。
Formの作成
※RegisterDto.javaの名称に変更して作成しています。
RegisterDto.javaに対応するhtmlの作成
※register.htmlの名称で作成。
submitした後の登録処理 Modelの作成
※RegisterprocessDtoの名称に変更して作成しています。
リポジトリの作成
※RegisterRepositpryの名称で作成。
サービスクラスの作成
com.example.demo配下にserviceパッケージを作製し、その中にRegisterservice..javaの名称で作製しています。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/03 23:49
2020/07/03 23:51