[解決済み] Spring Boot RESTでPOSTからJSON文字列を読み込んでみる
2023-05-11 09:11:10
質問
Spring Bootの最新版を使って、Restful Web Service経由でサンプルのJSONを読み込んでいるのですが...。
以下は私のpom.xmlです。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>org.springframework</groupId>
<artifactId>myservice</artifactId>
<version>0.1.0</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.2.2.RELEASE</version>
</parent>
<properties>
<java.version>1.7</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-rest-webmvc</artifactId>
</dependency>
<dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-releases</id>
<name>Spring Releases</name>
<url>https://repo.spring.io/libs-release</url>
</repository>
<repository>
<id>org.jboss.repository.releases</id>
<name>JBoss Maven Release Repository</name>
<url>https://repository.jboss.org/nexus/content/repositories/releases</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-releases</id>
<name>Spring Releases</name>
<url>https://repo.spring.io/libs-release</url>
</pluginRepository>
</pluginRepositories>
</project>
これが私のウェブサービスのコードです。
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/myservice")
public class BaseService {
@RequestMapping(value="/process", method = RequestMethod.POST)
public void process(@RequestBody String payload) throws Exception {
System.out.println(payload);
}
}
以下のコマンドで呼び出すと。
curl -H "Accept: application/json" -H "Content-type: application/json"
-X POST -d '{"name":"value"}' http://localhost:8080/myservice/process
こんなエラーメッセージが出ます。
{"timestamp":1427515733546,"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@8252f; 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@8252f; line: 1, column: 1]",
"path":"/myservice/process"
私がしようとしているのは、有効な JSON を (curl 経由の文字列として) 渡して、その String ペイロードが {"name":"value"} として処理メソッドに入るかどうかを確認することだけです。
私は何か間違っているのでしょうか?
お時間を割いていただきありがとうございました...
どのように解決するのですか?
JSONを消費する最も簡単で便利な方法は、JSONに類似したJavaクラスを使用することだと思います。 https://stackoverflow.com/a/6019761
しかし、もしJavaクラスが使えないのであれば、これら2つの解決策のうち1つを使うことができます。
解決策1:
を受信して行うことができます。
Map<String, Object>
を受け取ることができます。
@RequestMapping(
value = "/process",
method = RequestMethod.POST)
public void process(@RequestBody Map<String, Object> payload)
throws Exception {
System.out.println(payload);
}
あなたのリクエストを使って
curl -H "Accept: application/json" -H "Content-type: application/json" \
-X POST -d '{"name":"value"}' http://localhost:8080/myservice/process
解決策2:
そうでなければ、POSTペイロードを
String
:
@RequestMapping(
value = "/process",
method = RequestMethod.POST,
consumes = "text/plain")
public void process(@RequestBody String payload) throws Exception {
System.out.println(payload);
}
そして、その文字列を好きなようにパースします。なお、文字列には必ず
consumes = "text/plain"
を指定する必要があることに注意してください。
この場合、リクエストに
Content-type: text/plain
:
curl -H "Accept: application/json" -H "Content-type: text/plain" -X POST \
-d '{"name":"value"}' http://localhost:8080/myservice/process
関連
-
executeQuery()でデータ操作文が発行できない。解決方法
-
型に解決できない エラー解決
-
Javaクラスが "Error occurred during initialization of boot layer "というエラーで実行される。
-
java -jarコマンドでパッケージを実行すると、無効または破損したjarfile xxxx.jarが表示される。
-
java マイクロソフト払い戻し予期せぬサーバーからのファイルの終了
-
java.sql.SQLException: 結果セットの開始前
-
Java appears タイプEを囲むインスタンスがアクセスできない。
-
eclipse 実行 Java、エラー: 選択を起動できず、レシーバーもありません。
-
Web Project JavaでPropertiesファイルを読み込むと、「指定されたファイルがシステムで見つかりません」というソリューションが表示されます。
-
java 365*1000*60*60*24 計算問題
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
Eclipse の問題 アクセス制限。タイプ 'jfxrt' はAPI解決されていません。
-
型に解決できない エラー解決
-
スレッド "main" での例外 java.lang.ArrayIndexOutOfBoundsException:5 エラー
-
Java Notes 005_この行に複数のマーカーがある - キーを変数に解決できない - シンタックスエラー、ins
-
Javaジェネリックを1つの記事で
-
java マイクロソフト払い戻し予期せぬサーバーからのファイルの終了
-
-bash: java: コマンドが見つからない 解決方法
-
Javaがテキストファイルを読み込む
-
春ブート複数のデータソースの管理(atomikos)同じサーバーホスト上の複数のプロジェクトを開始する複数のJava - jarのエラーソリューション
-
Java基礎 - マッピングとQ/A