2017-08-21 17 views
1

のためのRESTエンドポイント、私は次のようにクラス階層のためJOINED継承戦略を使用しています:春MVC - 継承階層

abstract super class Product

concrete sub class Type1Product extends Product

concrete sub class Type2Product extends Product

今私がしたいですRESTエンドポイントを作成してユーザーにPOSTデータを送信し、製品の特定のサブクラスとして解析されるようにして、あらゆる種類の製品のエンドポイントを確認する。したがって、次のようなもの:私は投稿しようとすると、春が正しいのインスタンスとは対照的に、製品のインスタンスを作成しようとしているので、

@RequestMapping(method = POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE) 
    public Product save(@Valid Product product) { 
     // ... 
     return product; 
    } 

は現在、私は、私は抽象クラスを初期化することができないというエラーを取得しますサブタイプ。

私がしようとしていることは可能ですか?そうでない場合は、継承階層のためにこのようなエンドポイントを作成するときのベストプラクティスまたは規約は何ですか?

+0

返品時に商品クラスを具体的に返品し返品すると問題が解決する場合があります –

+0

しかし、商品自体は存在しないはずですので概念的に間違っています。私はこのアプローチを変えても構いません。このような状況がどのようにしてどのように取り組まれているのか疑問に思っています。 – user3690467

答えて

0

あなたがしようとしていることを見てみましょう。あなたはオブジェクトを逆直列化しようとしています。あなたは抽象クラスである製品をジャクソンに伝えています。

これは実現できませんでした。ジャックソンは追加属性に基づいてどの具体的なクラスが何であるか把握するために構築することができます。具体的なクラスは何ですか?

デシリアライズされたクラスのデフォルトコンストラクタを指定するときに呼び出されるので、クラスが機能しない抽象クラスである場合、各具体クラスのエンドポイントが必要です。または、DTOとモデルマッパーが必要です。DTOには、すべての可能な属性とモデルマッパーは、このアプローチを使用して1つのエンドポイントで行うことができるDTOに示されている具体的なクラスに依存する必要があります。

+0

私は実際にジャクソンを使用していませんが、あなたが言っているものを得て、私は同じことを考えました。別々のエンドポイント/コントローラーが最良のアプローチだと思いますか? – user3690467

+0

@ user3690467何を使用していますか? springはデフォルトでjacksonを使い、DTO/modelmapperに行くことができます –

関連する問題