実現したいこと
SpringBootを自学している初心者です。
「Spring解体新書第2版」を用いて、Spring Bootの学習をしています。
7章までは問題なく進めました。
8章の、MayBatisを使用してデータベースを操作する部分でつまづいております。
どうすれば、エラーを回避できるのか具体的な方法をご教授いただけますと幸いです。よろしくお願いいたします。
発生している問題・エラーメッセージ
以下、コンソールより Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled. [2m2023-07-22T11:46:13.909+09:00[0;39m [31mERROR[0;39m [35m15724[0;39m [2m---[0;39m [2m[ restartedMain][0;39m [36mo.s.b.d.LoggingFailureAnalysisReporter [0;39m [2m:[0;39m *************************** APPLICATION FAILED TO START *************************** Description: Field mapper in com.example.domain.user.service.impl.UserServiceImpl required a bean of type 'com.example.repository.UserMapper' that could not be found. The injection point has the following annotations: - @org.springframework.beans.factory.annotation.Autowired(required=true) Action: Consider defining a bean of type 'com.example.repository.UserMapper' in your configuration.
該当のソースコード
pom.xml
1(抜粋) 2 <!-- MyBatis --> 3 <dependency> 4 <groupId>org.mybatis.spring.boot</groupId> 5 <artifactId>mybatis-spring-boot-starter</artifactId> 6 <version>2.1.4</version> 7 <!-- <version>3.5.13</version> --> 8 </dependency> 9 10 <!-- Model Mapper --> 11 <dependency> 12 <groupId>org.modelmapper.extensions</groupId> 13 <artifactId>modelmapper-spring</artifactId> 14 <version>2.3.9</version> 15 </dependency>
application.properties
1# データベースの接続設定 2spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE 3spring.datasource.driver-class-name=org.h2.Driver 4spring.datasource.username=sa 5spring.datasource.password= 6spring.datasource.sql-script-encoding=UTF-8 7spring.datasource.Initialize=true 8spring.datasource.schema=classpath:schema.sql 9spring.datasource.data=classpath:data.sql 10 11#H2DB 12spring.h2.console.enabled=true 13 14#message 15spring.messages.basename=i18n/messages,i18n/ValidationMessages 16 17#MyBatis 18mybatis.mapper-locations=classpath*:/mapper/h2/*.xml 19 20#Log Level 21logging.level.com.example=debug 22
schema.sql
1CREATE TABLE IF NOT EXISTS employee( 2 id VARCHAR(50) PRIMARY KEY, 3 name VARCHAR(50), 4 age INT 5 ); 6 7 /* ユーザーマスタ */ 8 CREATE TABLE IF NOT EXISTS m_user( 9 user_id VARCHAR(50) PRIMARY KEY 10 ,password VARCHAR(100) 11 ,user_name VARCHAR(50) 12 ,birthday DATE 13 ,age INT 14 ,gender INT 15 ,department_id INT 16 ,role VARCHAR(50) 17 ); 18 19 20 /* 部署マスタ */ 21 CREATE TABLE IF NOT EXISTS m_department( 22 department_id INT PRIMARY KEY 23 ,department_name VARCHAR(50) 24 ); 25 26 27 /* 給料テーブル */ 28 CREATE TABLE IF NOT EXISTS t_salary( 29 user_id VARCHAR(50) 30 ,year_month VARCHAR(50) 31 ,salary INT 32 ,PRIMARY KEY(user_id,year_month) 33 ); 34
data.sql
1INSERT INTO employee(id,name,age) 2VALUES('1','Tom',30); 3 4 5/* ユーザーマスタ */ 6INSERT INTTO m_user( 7 user_id 8 ,password 9 ,user_name 10 ,birthday 11 ,age 12 ,gender 13 ,department_id 14 ,role 15) VALUES 16('system@co.jp','password','システム管理者','2000-01-01',21,1,1,'ROLE_ADMIN') 17,('user@co.jp','password','ユーザー1','2000-01-01',21,2,2,'ROLE_GENERAL') 18; 19 20 21 22 /* 部署マスタ */ 23INSERT INTTO m_department( 24 department_id 25 ,department_name 26) VALUES 27(1,'システム営業部') 28,(2,'営業部') 29; 30 31 32 /* 給料テーブル */ 33INSERT INTTO t_salary( 34 user_id 35 ,year_month 36 ,salary 37)VALUES 38('user@co.jp','2020/11',280000) 39,('user@co.jp','2020/12',290000) 40,('user@co.jp','2021/01',300000) 41; 42
MUser.java
1package com.example.domain.user.model; 2 3import java.util.Date; 4 5import lombok.Data; 6 7@Data 8public class MUser { 9 private String userId; 10 private String password; 11 private String userName; 12 private Date birthday; 13 private Integer age; 14 private Integer gender; 15 private Integer departmentId; 16 private String role; 17} 18
UserMapper.xml
1<?xml version="1.0" encoding="UTF-8"?> 2<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0//EN" 3 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 4 5<!-- Mappingとxmlのマッピング --> 6<mapper namespace="com.example.repository.UserMapper"> 7 8<!-- ユーザー1件登録 --> 9<insert id="insertOne"> 10 insert into m_user( 11 user_id 12 ,password 13 ,user_name 14 ,birthday 15 ,age 16 ,gender 17 ,department_id 18 ,role 19 ) 20 values( 21 #{userId} 22 ,#{password} 23 ,#{userName} 24 ,#{birthday} 25 ,#{age} 26 ,#{gender} 27 ,#{departmentId} 28 ,#{role} 29 ) 30</insert> 31</mapper>
UserServiceImpl.java
1package com.example.domain.user.service.impl; 2 3import org.springframework.beans.factory.annotation.Autowired; 4import org.springframework.stereotype.Service; 5 6import com.example.domain.user.model.MUser; 7import com.example.domain.user.service.UserService; 8import com.example.repository.UserMapper; 9 10 11@Service 12public class UserServiceImpl implements UserService { 13 14 @Autowired 15 private UserMapper mapper; 16 17 /** ユーザ登録 */ 18 @Override 19 public void signup(MUser user) { 20 user.setDepartmentId(1); //部署 21 user.setRole("ROLE_GENERAL"); //ロール 22 mapper.insertOne(user); 23 } 24 25 26} 27
JavaConfig.java
1package com.example.config; 2 3import org.modelmapper.ModelMapper; 4import org.springframework.context.annotation.Bean; 5import org.springframework.context.annotation.Configuration; 6 7@Configuration 8public class JavaConfig { 9 10 @Bean 11 public ModelMapper modelMapper() { 12 return new ModelMapper(); 13 } 14 15} 16
SignupController.java
1package com.example.controller; 2 3import java.util.Locale; 4import java.util.Map; 5 6import org.modelmapper.ModelMapper; 7import org.springframework.beans.factory.annotation.Autowired; 8import org.springframework.stereotype.Controller; 9import org.springframework.ui.Model; 10import org.springframework.validation.BindingResult; 11import org.springframework.validation.annotation.Validated; 12import org.springframework.web.bind.annotation.GetMapping; 13import org.springframework.web.bind.annotation.ModelAttribute; 14import org.springframework.web.bind.annotation.PostMapping; 15import org.springframework.web.bind.annotation.RequestMapping; 16 17import com.example.application.service.UserApplicationService; 18import com.example.domain.user.model.MUser; 19import com.example.domain.user.service.UserService; 20import com.example.form.GroupOrder; 21import com.example.form.SignupForm; 22 23import lombok.extern.slf4j.Slf4j; 24 25@Controller 26@RequestMapping("/user") 27@Slf4j 28public class SignupController { 29 30 @Autowired 31 private UserApplicationService userApplicationService; 32 33 @Autowired 34 private UserService userService; 35 36 @Autowired 37 private ModelMapper modelMapper; 38 39 /** ユーザー登録画面を表示 */ 40 @GetMapping("/signup") 41 public String getSignup(Model model,Locale locale, 42 @ModelAttribute SignupForm form) { 43 44 //System.out.println("1"); 45 46 //性別を取得 47 Map<String,Integer> genderMap = userApplicationService.getGenderMap(); 48 model.addAttribute("genderMap",genderMap); 49 50 //ユーザー登録画面に遷移 51 System.out.println("--1--"); 52 return "user/signup"; 53 } 54 55 56 /** ユーザー登録処理 */ 57 @PostMapping("/signup") 58 public String postSignup(Model model,Locale locale, 59 @ModelAttribute @Validated(GroupOrder.class) SignupForm form, 60 BindingResult bindingResult) { 61 62 //入力チェック結果 63 if(bindingResult.hasErrors()) { 64 //NG:ユーザ登録画面に戻ります 65 return getSignup(model,locale,form); 66 } 67 68 log.info(form.toString()); 69 70 71 // formをMUesrクラスに変換 72 MUser user = modelMapper.map(form,MUser.class); 73 74 //ユーザー登録 75 userService.signup(user); 76 77 //ログイン画面にリダイレクト 78 return "redirect:/login"; 79 } 80} 81
試したこと
1.書籍内容の見直し
何度もやっていますが間違いを見つけることができません
2.別環境(Eclipse2022)や、別のPCでの動作確認
同じ現象になります。
3.net情報の検索とさらなる?問題
MyBatisのバージョンの問題について言及されているサイトを見つけ、EclipseのマーケットプレイスからMyBatis Generator 1.4.2をインストールしようとしていますが、
https://mybatis.jfrog.io/artifactory/generator-eclipse-release/ のリポジトリーを読み取ることができません。
https://mybatis.jfrog.io/artifactory/generator-eclipse-release/ は有効なリポジトリー・ロケーションではありません。
と表示されインストールができません。
(別PCでも同様でした)
繰り返しとなりますが、どうぞご教授お願いいたします。

回答2件
あなたの回答
tips
プレビュー