[解決済み] POST リクエスト送信時に org.springframework.http.converter.HttpMessageNotReadableException が発生する。
2022-02-03 06:12:56
質問
以下のコントローラを持つSpringアプリケーションを持っています。
@RestController
@RequestMapping("/app")
public class RegisterRestController {
@Autowired
UserRepository userRepository;
@Autowired
PasswordEncoder passwordEncoder;
@Autowired
UserService userService;
@RequestMapping( value="/loginuser", method =RequestMethod.POST,produces="application/json")
public String loginUser(@RequestBody String requestBody) {
System.out.println("inside");
JSONObject responseJsonObject = new JSONObject();
String phonenumber;
String password;
try{
JSONObject object = new JSONObject(requestBody);
phonenumber = object.getString("phonenumber");
password = object.getString("password");
User user = userService.findByNumber(phonenumber);
String sha256Password = passwordEncoder.encode(password);
if(sha256Password.equals(user.getPassword())){
responseJsonObject.put("response", "Login Successful");
}
else {
responseJsonObject.put("repsonse", "Login failed");
}
}
catch (Exception e){
e.printStackTrace();
try {
responseJsonObject.put("response", "Invalid Credentials");
} catch (JSONException e1) {
e1.printStackTrace();
}
}
return responseJsonObject.toString();
}
しかし、Postmanから.NET Frameworkを含むPOSTリクエストを送ると、:
{
"phonenumber":"9123456789",
"password":"password"
}
次のような応答が返ってきます。
{
"timestamp": 1456043810789,
"status": 400,
"error": "Bad Request",
"exception": "org.springframework.http.converter.HttpMessageNotReadableException",
"message": "Could not read JSON: Can not deserialize instance of java.lang.String out of START_OBJECT token\n at [Source: java.io.PushbackInputStream@eaa3acb; line: 1, column: 1]; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.String out of START_OBJECT token\n at [Source: java.io.PushbackInputStream@eaa3acb; line: 1, column: 1]",
"path": "/app/loginuser"
}
あと、Spring Securityも同様に実験していました。サーバーにはエラーは出ず、コントローラには"inside"が出力されないので、リクエストを受信していないようです。私はSpringを知ろうとしているのですが、このようなエラーの原因を見つけることができませんでした。ご教示いただければ幸いです。よろしくお願いします。
解決方法は?
あなたのコードには2つの問題があります。
- コントローラ内でJSONをオブジェクトに変換しようとしている。 これはすでにSpringが行っています。リクエストのボディを受け取り、コントローラメソッド内の対応するパラメーターのJavaクラスに変換しようとします。
-
コントローラのメソッドでは、1つの文字列を想定しています。
@RequestBody String requestBody
そして、2つのプロパティを持つオブジェクトを送信していますね。
{
"phonenumber": "9123456789",
"password": "password"
}
解決策
ログインに必要な値のクラスを作成します。
public class Login {
public String phonenumber;
public String password;
// you need a zero argument constructor
// maybe you have to add getter and setters
}
コントローラのメソッドを変更し、このタイプのオブジェクトを期待するようにします。
@RequestBody Login requestBody
関連
-
[解決済み】Hibernateエラー:同じ識別子値を持つ別のオブジェクトがすでにセッションに関連付けられました。
-
[解決済み】Android Studio クラス org.codehaus.groovy.runtime.InvokerHelper を初期化できませんでした。
-
[解決済み】popBackStack()とreplace()の操作はどう違うのですか?
-
[解決済み】スレッド「main」での例外 java.lang.StringIndexOutOfBoundsException: 文字列のインデックスが範囲外です。0 [閉店]
-
[解決済み】Java JDK - doubleからintへの非可逆変換の可能性
-
[解決済み】-XX:MaxPermSizeは何をするのですか?
-
[解決済み】破損したjarファイル
-
[解決済み】Javaで文字列をコピーするにはどうしたらいいですか?
-
[解決済み】ソースルート外のJavaファイル intelliJ
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Android Studio クラス org.codehaus.groovy.runtime.InvokerHelper を初期化できませんでした。
-
[解決済み] java のクラス内のコンストラクタは、指定された型に適用できない
-
[解決済み] 二項演算子「&」のオペランド型がおかしい java
-
[解決済み】Java JDK - doubleからintへの非可逆変換の可能性
-
[解決済み] メソッドがスーパータイプのメソッドをオーバーライドまたは実装していない - Overrideの場合
-
[解決済み】JLabelのテキストを中央に配置するには?
-
[解決済み】Javaを使用するSelenium - ドライバの実行ファイルのパスは、webdriver.gecko.driverシステムプロパティで設定する必要があります。
-
[解決済み】Javaメソッドスタブ
-
[解決済み] StringBuilderをクリアまたは空にするにはどうすればよいですか?重複] [重複] [重複] [重複] [重複] [重複
-
[解決済み] SQLエラー。0, SQLState: 08S01 通信リンクの失敗 [重複]。