0

以下のようなコントローラーを備えた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を起動させる方法はありますか、またはハンドラーの戻り値を(モデルとともに)インターセプトする別の方法を誰かが提案できますか?

4

2 に答える 2

0

拡張コントローラのベース コントローラへの単純な委譲はどうですか。

@Controller
public class ActionExtendedController {
    @Autowired ActionRestController baseRestController;
    @Autowired MappingJacksonJsonView mappingJacksonJsonView;

    @RequestMapping(value = "/searchlist", method = GET)
    public View list(Action action, SearhCriteria searchCriteria, Model model) {
        List<Action> actions = baseRestController.list(action, searchCriteria, model);
        model.addAttribute("actions", actions);
        model.addAttribute("searchParameters", searchCriteria);
        return mappingJacksonJsonView;
    }

このようにして、元のコントローラーに委譲しますが、この新しいコントローラーをビューに使用します。を Bean として登録するだけでmappingJacksonJsonView、すべてのモデル オブジェクト (検索基準とアクション) が json ビューにシリアル化されます。ビューを返す必要さえありませんが、応答と検索条件を保持できる型で @ResponseBody を使用することもできます。

于 2012-09-09T14:18:14.893 に答える
0

戻り値の型を Map に変更してみませんか? お気に入り:

@Controller
public class ActionRestController {
@RequestMapping(value = "/list", method = GET)
@ResponseBody
public Map<String, Object> list(Action action, SearhCriteria searchCriteria) {  
    Map<String, Object> map = new HashMap<String, Object>();     
    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
    map.put("searchResult",ret);
    map.put("searchCriteria", searchCriteria);
    return map;
}
于 2012-09-09T09:51:38.550 に答える