前提・実現したいこと
現在Javaを使用して掲示板を作製しています。
ユーザー登録とログインを実施する機能を実装しようとした所、登録ボタンを押した際に登録情報がMYSQLのuserテーブルに反映されない状態になっています。
発生している問題・エラーメッセージ
パスワードとユーザーネームをフォームから入力し、登録ボタンを押してもユーザー登録が出来ないと言った状態です。
web上で表示されるエラー
Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback. Sun Jul 05 08:42:27 JST 2020 There was an unexpected error (type=Internal Server Error, status=500). No message available
該当のソースコード
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="${registerDto}" method="post"> <h1>ユーザー登録</h1> <div th:classappend="${#fields.hasErrors('name')}? 'has-error'"> <label for="name">アカウント名</label> <div> <input id="name" type="text" th:field="*{name}" name="name"/> <span th:if="${#fields.hasErrors('name')}" th:errors="*{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>
login.html
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>ログイン</title> </head> <body> <form th:action="login" method="POST"> <table align="center"> <tr> <td> ユーザ名: </td> <td> <input type="text" id="user" name="user"/> </td> </tr> <tr> <td> パスワード: </td> <td> <input type="password" id="password" name="password"/> </td> </tr> <tr> <td> </td> <td align="right"> <button type="submit">ログイン</button> </td> </tr> <tr> <td> </td> <td align="right"> <a href="/register/">新規登録</a> </td> </tr> </table> </form> </body> </html>
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() // /threadURLも認証不要 .anyRequest().authenticated(); // それ以外はすべて認証された状態じゃなきゃダメ } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); //パスワードのハッシュ化でBCryptを使う } }
RegisterController.java
package com.example.demo.controller; import org.springframework.stereotype.Controller; import org.springframework.validation.BindingResult; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import com.example.demo.dto.RegisterDto; import com.example.demo.dto.RegisterprocessDto; import com.example.demo.service.RegisterService; @Controller public class RegisterController { @ModelAttribute public RegisterDto setupForm() { return new RegisterDto(); } @RequestMapping(value="register") public String registerDto() { return "register"; } @RequestMapping(value = "/register/", method = RequestMethod.POST) String create(@Validated RegisterDto form, BindingResult bindingResult) { if (bindingResult.hasErrors()) { return "/register/"; } RegisterprocessDto registerprocessDto = new RegisterprocessDto (); RegisterService registerService = new RegisterService (); registerprocessDto.setName(form.getName()); registerService.create(registerprocessDto, form.getPassword()); return "redirect:/complete"; }
RegisterDto.java
package com.example.demo.dto; import java.io.Serializable; import lombok.Data; @Data public class RegisterDto implements Serializable { private String name; private String password; }
RegisterprocessDto
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 lombok.Data; @Entity @Table(name = "users") @Data public class RegisterprocessDto implements Serializable { @Id @GeneratedValue private Integer user_id; @Column(nullable=false) private String name; @Column(nullable=false, length=20) private String password; @Column(nullable=false, updatable=false) private Date created_at; @Column(nullable=false) private Date updated_at;
RegisterRepositpry
package com.example.demo.dao; import org.springframework.data.jpa.repository.JpaRepository; import com.example.demo.dto.RegisterprocessDto; public interface RegisterRepository extends JpaRepository<RegisterprocessDto, Integer> { }
RegisterService.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 com.example.demo.dao.RegisterRepository; 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); } }
試したこと
参考記事を基に、自身のコード内容を確認し、間違いや異なる部分があるか確認していきましたが解決に至りませんでした。
気になる点としては、WebSecurityConfig.javaの部分にログインしていない場合はログインフォームに飛ばす機能を追加した際にエラーが警告文が発生し、追加できなかったことです。こちらが今出ているエラーにも影響しているか定かではありませんが、以下のコードには入っていません。
.and() .formLogin() // ログインページに飛ばすよ .loginProcessingUrl("/login") // ログイン処理をするURL .loginPage("/login"); // ログインページのURL
補足情報(FW/ツールのバージョンなど)
Java SE8
Eclips Version: 2020-03 (4.15.0)
SpringBoot
Mysql8.0
参考記事からの名称変更や設定部分
ユーザデータを登録する処理用のController作成
※RegisterControllerの名称に変更して作成しています。
Formの作成
※RegisterDto.javaの名称に変更して作成しています。
RegisterDto.javaに対応するhtmlの作成
※register.htmlの名称で作成。
submitした後の登録処理 Modelの作成
※RegisterprocessDtoの名称に変更して作成しています。
リポジトリの作成
※RegisterRepositpryの名称で作成。
サービスクラスの作成
com.example.demo配下にserviceパッケージを作製し、その中にRegisterservice..javaの名称で作製しています。
自身の全体のGithub内容はこちらになります。
リンク内容
回答1件
あなたの回答
tips
プレビュー