1

シナリオ

DB に格納されているさまざまな種類のオブジェクトにクライアントがアクセスできるようにする API を構築する必要があります (現在、私の DAO は Hibernate ベースです)。これらはGETted またはPOSTed です。

現在、GET署名は次のとおりです。

@RequestMapping(value = "/rest/{datatype}", method = RequestMethod.GET, produces = { "application/json" })
    public @ResponseBody
    Object[] getData(@PathVariable("datatype") String dataType,
            WebRequest request) throws HttpException {

これは、URL のデータ型に応じて、特定のリポジトリにアクセスし、ビジネス ドメインのオブジェクトを返すことを意味します。これまでのところ問題なく動作します。

の場合POST、JSON 形式でオブジェクトを送信し、それをクラスに変換して、データベースに格納できる必要があります。

明らかに、postFunfData(SpecificDataType object)Jackson を使用すると、JSON をオブジェクトに正常に変換できますが、コンパイル時にオブジェクトの型がわかりません。

もう 1 つの要件は柔軟性です。ドメインに新しいクラスが追加された場合、新しいデータ型をサポートするために必要なコード作業はほとんどありません。GETter では、新しいデータ型をサポートするスイッチを追加し、Spring で正しいリポジトリをインスタンス化し、DB にクエリを実行します。

質問

「何でも」をリクエスト本文として受け入れ、JSON から正しいオブジェクトに変換できるようにする Spring MVC REST API を作成するにはどうすればよいですか? 何かのようなもの:

public void postData(@RequestBody Object objData){
    if (objData instanceof Class1) {
        Class1 obj = (Class1) objData;
        Class1Repository.store(obj);
    }
    [...]
}
4

2 に答える 2

0

可能な答え

(より良い解決策を見つけた場合は、それを提供してください)

同じスケルトンに基づいていくつかの単純な API を作成する

@RequestMapping(value = "/rest/class1", method = RequestMethod.POST, consumes = { "application/json" })
public void postData(@RequestBody Class1 objOfClass1){
    store(objOfClass1)
}

@RequestMapping(value = "/rest/class2", method = RequestMethod.POST, consumes = { "application/json" })
public void postData(@RequestBody Class2 objOfClass2){
    store(objOfClass2)
}

このようにして、Spring MVC がパスを分析すると、リクエストを処理する正しいコントローラー メソッドが見つかります。次に、Jackson にリクエスト ボディをリフレクションによって検出された引数の型に変換するように要求します。

于 2013-02-12T13:20:22.970 に答える