インターフェイスと@RequestBody
-
12-10-2019 - |
質問
現在、ユーザーが特定の期間にわたって選択したリソースの使用を(Web経由で)予約できるプロジェクトに取り組んでいます。このプログラムでは、インターフェイスへのプログラミングのSpringの哲学(および一般的なベストプラクティス)を維持しようとしているため、コンクリートクラスの間で機能が繰り返される場所でインターフェイスを使用しようとします。
私が作成した1つのインターフェイスは、予約するあらゆるタイプのリソースの最小必要な機能を処理するためにコントローラーが必要とするメソッドを指定するBookableresourceControllerと呼ばれます。また、2番目のインターフェイスであるBookableresourceも使用します。Bookableresourceは、アプリケーションを通じて予約できるリソースをモデル化するオブジェクトを識別します。
私が現在遭遇している問題は、bookableresourcecontrollerによって定義されたいくつかのメソッドが@requestbodyマッピングを使用してJSONオブジェクトをメソッドパラメーターに変換することです。ジャクソンはJSONを「simpletype」オブジェクトに変換できるため、エラーを受け取ることができます。入力パラメーターをBookableresourceに指定します。
@RequestMapping(value="/delete.html", method = RequestMethod.POST)
public ModelAndView processDeleteResource(
@RequestBody BookableResource resource);
org.codehaus.jackson.map.type.simpletypeのインスタンスを構築できません。問題:抽象型は追加のタイプ情報でのみインスタンス化できます
このエラーがあることから、Bookableresourceの特定の実装を定義する必要があることを意味します。つまり、この目的に使用されるコントローラーはそれらのメソッドを必要とする場合でも、これらのメソッドをインターフェイスから除外する必要がある可能性が高いことを意味します。
私が尋ねているのは、誰かがインターフェイスをから予想されるオブジェクトとして定義する方法を知っているかどうかです @RequestBody
JSONを使用したマッピング、またはこれらのメソッドを含めるために私の接点インターフェイスを構築する方法について何か提案がありますか?
乾杯
解決
うまくいくかどうかはわかりませんが、ジェネリックにすることを試みることができます:
public interface BookableResourceController<R extends BookableResource> {
@RequestMapping(value="/delete.html", method = RequestMethod.POST)
public ModelAndView processDeleteResource(@RequestBody R resource);
}
他のヒント
使用できる追加の方法は、ジャクソンアノテーションとインターフェースに注釈を付けることです。
@JsonDeserialize(as=BookableResourceImp.class)
(インターフェイスクラスに直接追加したくない場合は、ミックスインアノテーションを使用する可能性があります)
編集: :別の可能性は使用することです SimpleModule
方法 addAbstractTypeMapping()
実装タイプを指定します。これにより、インターフェイスから実装へのリンケージが回避され、この側面を登録するためのより便利な方法があります(またはそうでない場合があります)。