2012-09-09 169 views
0

的我@ResponseBody有電腦板一個Spring MVC Web應用程序如下圖所示:攔截Spring MVC中

@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; 
} 

當用戶執行搜索控制器被調用。應用中有幾個這樣的控制器,每個可搜索的實體一個。 由於我無法很好解釋的原因,在這裏,我無法修改這些控制器。

但是現在,我已經在UI中要求顯示搜索條件和否。的記錄和分頁細節。該信息不由控制器返回。 Controller返回的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"; 
} 

高達至此,所有的好。 我想要做的就是在控制器返回List的地方攔截請求,然後將其轉換爲JSON,並返回包含列表和搜索參數的地圖。

現在,由於'不可變'的控制器用戶ResponseBody控制轉到JacksonMessageConverter並且響應從那裏出去。我已經嘗試了以下路徑,但它們不起作用。

  • 攔截 - 到時候我來到這裏,響應已經寫好了,所以也沒有辦法去改變它。

  • 用於JasksonMessageConverter的自定義ObjectMapper - 不起作用,因爲我無法訪問映射器中的模型對象,所以我只能訪問控制器返回的列表。

  • 方面@控制器的切入點 - 我認爲這種技術會工作,但我無法讓它工作。建議不會觸發,我相信我在配置中缺少一些東西。

有沒有辦法讓Spring AOP火上標註的控制器,處理方法或 任何人都可以提出攔截處理程序返回值(與模型一起)的另一種方法是什麼?

回答

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; 
    } 

這樣你委託給原來的控制器,但使用的針對這種新的控制器。只需註冊一個mappingJacksonJsonView作爲一個bean,它會將所有模型對象(searchcriteria和actions)序列化到json視圖中。您甚至不需要返回視圖,但也可以使用@ResponseBody,其中可以包含響應和搜索條件。

+0

謝謝,我想我會選擇這個選項。我曾經簡單地思考過這個問題,但沒有去追求它,認爲直接調用控制器方法可能不是那麼好,設計明智。但現在我想到了,除了以下內容,我不能想到任何主要缺點 - 如果參數或基本控制器的路徑變量發生更改,並且它們作爲參數添加到處理程序方法中,調用處理程序還必須具有可用的數據 - 可能會或可能不會是好事。但爲了我的目的,它會起作用。 – Anupama

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; 
} 
+0

不,正如我所說,無論如何我無法更改原始控制器類。 – Anupama