以下のようなコントローラーを備えたSpring MVC Webアプリケーションがあります。
@Controller
public class ActionRestController {
@RequestMapping(value = "/list", method = GET)
@ResponseBody
public List<Action> list(Action action, SearhCriteria searchCriteria) {
List<Action> ret = new ArrayList<Action>();
// Call a service method to get the records
// Copy the records into the list
// return the list of objects
return ret;
}
ユーザーが検索を行うと、コントローラーが呼び出されます。アプリには、検索可能なエンティティごとに 1 つずつ、そのようなコントローラーがいくつかあります。うまく説明できない理由により、ここでは、これらのコントローラーを変更することはできません。
しかし今、UI で検索条件と no を表示する必要があります。レコードとページングの詳細についても同様です。この情報はコントローラから返されません。コントローラーによって返される JSON には、レコードのリストのみが含まれます。
リクエストを処理し、モデルに追加情報を取得して配置し、以下のように既存のコントローラーにリクエストを転送する別のコントローラーを用意しました。
@Controller
public class ActionExtendedController {
@RequestMapping(value = "/searchlist", method = GET)
@ResponseBody
public List<Action> list(Action action, SearhCriteria searchCriteria, Model model) {
model.addAttribute("searchParameters", searchCriteria);
return "forward:/list";
}
この時点までは、すべて順調です。私がやりたいことは、JSON に変換される前に、List がコントローラーから返される時点でリクエストをインターセプトし、リストと検索パラメーターを含むマップを返すことです。
「不変」コントローラーは ResponseBody を使用するため、コントロールは JacksonMessageConverter に移動し、そこから応答が送信されます。私はすでに次のパスを試しましたが、うまくいきません。
インターセプター - ここに来るまでに、応答は既に書き出されているため、変更する方法はありません。
JasksonMessageConverter のカスタム ObjectMapper - マッパー内のモデル オブジェクトにアクセスできないため、機能しません。コントローラーから返されたリストにしかアクセスできません。
コントローラーの Aspect @After ポイントカット - この手法は機能すると思いますが、機能させることができません。アドバイスは起動せず、構成に何かが欠けていると確信しています。
注釈付きのコントローラー、ハンドラーメソッドでSpring AOPを起動させる方法はありますか、またはハンドラーの戻り値を(モデルとともに)インターセプトする別の方法を誰かが提案できますか?