前提・実現したいこと
RESTサービスユーザーを新規登録するPOSTメソッド処理を実装したいです
コンソールで打ち込み
$ curl -XPOST "http://localhost:8080/rest/insert" -H 'Content-Type: application/json' -d '{"userId":"yamada@co.jp","password":"pass","userName":"yamada","birthday":"1911-11-11","age":"111","marriage":"false","role":"ROLE_ADMIN"}'
jsonで{"result":"ok"}
jsonで{"result":"ok"}が帰ってきて
ユーザー一覧にもしっかり新規Userが反映されるようにしたい
発生している問題・エラーメッセージ
Caused by: org.h2.jdbc.JdbcSQLDataException: パラメータ "parameterIndex" に対する値 "8" が不正です Invalid value "8" for parameter "parameterIndex" [90008-200] at org.h2.message.DbException.getJdbcSQLException(DbException.java:590) at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) at org.h2.message.DbException.get(DbException.java:205) at org.h2.message.DbException.getInvalidValueException(DbException.java:280) at org.h2.jdbc.JdbcPreparedStatement.setParameter(JdbcPreparedStatement.java:1503) at org.h2.jdbc.JdbcPreparedStatement.setString(JdbcPreparedStatement.java:413) at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.setString(HikariProxyPreparedStatement.java) at org.springframework.jdbc.core.StatementCreatorUtils.setValue(StatementCreatorUtils.java:398) at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValueInternal(StatementCreatorUtils.java:231) at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValue(StatementCreatorUtils.java:162) at org.springframework.jdbc.core.ArgumentPreparedStatementSetter.doSetValue(ArgumentPreparedStatementSetter.java:69) at org.springframework.jdbc.core.ArgumentPreparedStatementSetter.setValues(ArgumentPreparedStatementSetter.java:50) at org.springframework.jdbc.core.JdbcTemplate.lambda$update$2(JdbcTemplate.java:963) at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:651) ... 154 more
該当のソースコード
package com.example.demo.controllers; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import com.example.demo.Service.RestService; import com.exmple.demo.models.User; @RestController //戻り値にhtmlファイル以外を指定できる public class UserRestController { @Autowired RestService service; //ユーザー全体取得 @GetMapping("/rest/get") public List<User>getUserMany(){ return service.selectMany(); } //ユーザー1件取得 @GetMapping("/rest/get/{id:.+}") public User getUserOne(@PathVariable("id")String userId) { //ユーザー1件取得 return service.selectOne(userId); } @PostMapping("/rest/insert") public String postUserOne(@RequestBody User user) { //ユーザーを1件登録 boolean result = service.insert(user); String str = ""; if (result == true) { str = "{\"result\":\"ok\"}"; } else { str = "{\"result\":\"error\"}"; } return str; } }
package com.example.demo.Repository; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.example.demo.Service.RestService; import com.exmple.demo.models.User; @Transactional @Service public class RestServiceJdbcImpl implements RestService{ @Autowired @Qualifier("UserDaoJdbcImpl") UserDao dao; //1件登録メソッド @Override public boolean insert(User user) { int result = dao.insertOne(user); if (result == 0){ return false; }else { return true; } } //1件検索用メソッド @Override public User selectOne(String userId) { return dao.selectOne(userId); } //全件検索用メソッド @Override public List<User> selectMany(){ return dao.selectMany(); } //1件更新用メソッド @Override public boolean update(User user) { return false; } //1件削除用メソッド @Override public boolean delete(String userId) { return false; } }
/*従業員テーブル */ CREATE TABLE IF NOT EXISTS employee( employee_id INT PRIMARY KEY, employee_name VARCHAR(50), age INT ); /*ユーザーマスタ*/ CREATE TABLE IF NOT EXISTS m_user( user_id VARCHAR(50) PRIMARY KEY, password VARCHAR(100), user_name VARCHAR(50), birthday DATE, age INT, marriage BOOLEAN, role VARCHAR(50) );
package com.example.demo.Repository; import java.sql.Date; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Repository; import com.exmple.demo.models.User; @Repository("UserDaoJdbcImpl")//Bean名をセット@Autowiredする時クラス指定できる public class UserDaoJdbcImpl implements UserDao{ @Autowired JdbcTemplate jdbc; @Autowired PasswordEncoder passwordEncoder; //Userテーブルの件数を取得 @Override public int count()throws DataAccessException{ //全件取得してカウント int count = jdbc.queryForObject("SELECT COUNT(*)FROM m_user",Integer.class); return count; } //Userテーブルにデータを1件挿入 @Override public int insertOne(User user)throws DataAccessException{ String password = passwordEncoder.encode(user.getPassword()); String sql = "INSERT INTO m_user(user_id," + "password," + "user_name," + "birthday," + "age," + "marriage," + "role)" + "VALUES(?,?,?,?,?,?,?)"; int rowNumber = jdbc.update(sql, user.getUserId(), password, user.getPassword(), user.getUserName(), user.getBirthday(), user.getAge(), user.isMarriage(), user.getRole()); return rowNumber; } @Override public User selectOne(String userId)throws DataAccessException{ //Userテーブルのデータを1件取得 //1レコードの内容をMapとして取得する(queryForMap) //? 動的に変化する値 Map<String,Object>map = jdbc.queryForMap("SELECT * FROM m_user"+" WHERE user_id = ?",userId); //結果返却用の変数 User user = new User(); //Userインスタンスにデータセット user.setUserId((String)map.get("user_id")); user.setPassword((String)map.get("password")); user.setUserName((String)map.get("user_name")); user.setBirthday((Date)map.get("birthday")); user.setAge((Integer)map.get("age")); user.setMarriage((Boolean)map.get("marriage")); user.setRole((String)map.get("role")); return user; } //Userテーブルの全データを取得 @Override public List<User>selectMany()throws DataAccessException{ //複数行のレコードを取得する(queryForList) List<Map<String,Object>>getList = jdbc.queryForList("SELECT*FROM m_user"); //結果返却用の変数 List<User>userList = new ArrayList<>(); //取得したデータを結果返却用のListに格納 for(Map<String, Object>map:getList) { User user = new User(); //Userインスタンスにデータセット user.setUserId((String)map.get("user_id")); user.setPassword((String)map.get("password")); user.setUserName((String)map.get("user_name")); user.setBirthday((Date)map.get("birthday")); user.setAge((Integer)map.get("age")); user.setMarriage((Boolean)map.get("marriage")); user.setRole((String)map.get("role")); //結果返却用のListに追加 userList.add(user); } return userList; } //Userテーブルを1件更新 @Override public int updateOne(User user)throws DataAccessException{ String password = passwordEncoder.encode(user.getPassword()); int rowNumber = jdbc.update(" UPDATE M_USER" + " SET" + " password = ?," + " user_name = ?," + " birthday = ?," + " age = ?," + " marriage = ?" + " WHERE user_id = ?" , user.getPassword() , password , user.getUserName() , user.getBirthday() , user.getAge() , user.isMarriage() ,user.getUserId()); //トランザクション確認、例外 // if (rowNumber > 0){ // throw new DataAccessException("トランザクションテスト"){}; // } return rowNumber; } //Userテーブルを1件削除 @Override public int deleteOne(String userId)throws DataAccessException{ int rowNumber = jdbc.update("DELETE FROM m_user WHERE user_id = ?",userId); return rowNumber; } //SQL取得結果をサーバーにCSV(カンマで区切られたデータ形式)で保存 @Override public void userCsvOut()throws DataAccessException{ String sql = "SELECT * FROM m_user"; //ResultSetExtractorの生成 UserRowCallbackHandler handler = new UserRowCallbackHandler(); //SQLの実行、CSV出力 jdbc.query(sql,handler); } }
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/01 12:16
2021/05/01 19:04