質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

3194閲覧

RESTサービスでユーザーを新規登録するPOSTメソッド処理を実装したい

goriwo

総合スコア17

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2021/05/01 08:57

前提・実現したいこと

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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

見た感じ
0. ?
0. ,?
0. ,?
0. ,?
0. ,?
0. ,?
0. ,?

に対し

  1. user.getUserId(),
  2. password,
  3. user.getPassword(),
  4. user.getUserName(),
  5. user.getBirthday(),
  6. user.getAge(),
  7. user.isMarriage(),
  8. user.getRole()

で、
受け付けるパラメータに対し渡したパラメータの数が合ってませんね。
エラーで指摘されている通りに思います。

投稿2021/05/01 09:31

編集2021/05/01 09:32
m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

goriwo

2021/05/01 12:16

おっしゃる通りでした 引数なおしたらできました ありがとうございました
m.ts10806

2021/05/01 19:04

はい。エラーメッセージをしっかり読んでください。 訳の分からない暗号ではなく、正しく間違ってる個所を指摘してくれています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問