2017-09-14 6 views
0

私はSpring-mvcで簡単な辞書RESTful APIを開発しています。関連エンティティ上記コードに基づい外部キーを使用してオブジェクトを保存するための専門的/標準的な方法は何ですか?

public class Word { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int id; 

    private String word; 

    @ManyToOne(fetch=FetchType.EAGER) 
    @JoinColumn(name="LANGUAGE_ID", insertable=false, updatable=false) 
    private Language language; 

}

Languageである2つの関連するエンティティが存在します。

問題:私は、POST要求でWordエンティティにCREATE操作を実装したいと思います。実装は難しいことではありませんが、私はPOSTリクエストURLとJSONのリクエストボディに関連して、少なくとも2つの解候補を見つけた:

ソリューションCandicate I:直接JSONボディ要求に挿入します。 JSON本体は、ネストされたJSONオブジェクトが含まれている - 言語、

{id:1, word:"hello", Language: {id:1, language:"English"}}

参照のようなもの:Spring: Save object with foreign keys with a POST request

ソリューション候補II:POSTリクエストのURLを介して参照言語IDを取得し、

のような何かを言うとこのよう

POST http://localhost:8080/rest/language/1/words

、全くLanguage基準Aが存在しませんJSON POSTリクエスト本体のすべてを返します。

参照:https://www.youtube.com/watch?v=_Jnu_jHfQbM

I持っている2つの質問:

質問1:これら二つの解の候補のうち、より良い1、または言うプロの標準的なソリューションですか?または他の解決策がありますか?

質問2:両方与えられた解候補にとして、どのような場合には、我々は、少なくとも対応するcontrollerクラスで参照Language POJOを取得する必要があります。しかし、OO設計の原則の観点から見ると、この方法はコントローラと緊密に結びついているように思われるので、私はこの検索動作をコントローラ以外のどこかで切り離す必要があると考えていますか?例えば、service層にある。しかし、これはプロの方法ですか?対応するDTOが必要ですか?

答えて

0

私の意見では、保存すべきデータは本文にネストされている必要があります。 Springはjsonデータをオブジェクトに直接マップすることができ、パラメータから別のモデルクラスに設定する必要はありません。

私はあなたのエンティティ用に別々のモデルクラスを作成します。コントローラはデータをモデルクラスに埋め込み、サービスに渡します。次に、サービスはモデルクラスをエンティティにマップします。その後、リポジトリ経由で保存することができます。

例:

言語に属し 言葉が、私は次のようにそれを設計することを想定すると
@Controller 
public class RestController { 

    @Autowired 
    RestService restService; 

    @PostMapping(value="/") 
    public void saveVariable(@RequestBody TestModel testModel) { 
    testService.saveTest(testModel); 
    } 
} 

@Service 
public class RestService { 

    @Autowired 
    TestRespository testRepository; 

    public void saveTest(TestModel testModel) { 
    TestEntity testEntity = new TestEntity(); 
    //some mapping from testModel to testEntity 
    testRepository.save(testEntity); 
    } 
} 
+0

まずはあなたのアドバイスをありがとうございました:)「あなたのエンティティ用に別々のモデルクラスを作成する」とはどういう意味ですか?私は2つの別個のエンティティ、言葉と言葉を持っていました。おそらく私はDTOを持っているべきですか?あなたが与えたTestModelはちょっとDTOですか? – Rui

+0

はい、私はコントローラのエンティティを使用して好きではありません。だから私は必要な対応するエンティティの値を保持する別のクラスを作成します。 –

0

POST /api/languages/en/words HTTP/1.1 
Host: localhost:8080 
Content-Type: application/json 

{ 
    "word": "hello" 
} 

ワード(JSON文書の表現を(例えば、の言語は、の語を持つURLに、要求のペイロードで送信されます)。)。

言語を識別するのに、two-letter codesを使用することもできます。これは、数値よりも明確な方法であるためです。上記の例では、en英語を意味します。


は、私はあなたのREST APIと代わりuse DTOsで永続エンティティの公開を回避することをお勧めします。 RESTリソース表現は、永続オブジェクトと同じ属性を持つ必要はありません。


RESTコントローラを可能な限りリーンに保ち、サービス層がビジネスルールに重点を置いているようにしてください。

+0

おかげさまでアドバイスをいただきありがとうございます:) – Rui

+0

あなたの応答もOKです。しかし、ベンジャミンからの回答は、私の視点からすれば受け入れられますが、ほとんどの場合、あなたのソリューションに選択することになります。さらに、Benjaminの応答は早く来た。このため申し訳ありません:) – Rui

関連する問題