2013-06-03 170 views
0

我正在重構傳統應用程序以使用Spring MVC。我的所有控制器(遺留)返回一個Model類型的對象,我的遺留調度程序編寫model.getContent()的輸出,方法getContent執行內部處理並返回一個json字符串。我有數百個控制器,不想重寫它們。是否有可能編寫自定義視圖處理程序並將其包含在spring servlet配置中?Spring MVC自定義視圖

樣品控制器:

public UserList extends BasicAction { 
    @Autowired 
    UserService userService; 
    @Autowired 
    UserCommand userCommand; 

    @Override 
    public Model getModel(Request req, Response resp) 
      throws ServletException, IOException { 
     Model model = new Model(); 


     List<User> users; 
     try { 
      users = userService.getUsers((UserCriteria)userCommand.getResult()); 
      model.addCollection(users); 
      model.setWrapper(new UserWrapper()); 


     } catch (ValidationException e) { 

      e.printStackTrace(); 
     } catch (WebCommandException e) { 

      e.printStackTrace(); 
     } 



     return model; 
    } 
} 

我打算做註解@Controller。指定@RequestMapping或在xml配置中,移除基類BasicAction(legacy mvc)。我最近在這個項目中引入了spring,並重構了使用依賴注入和請求作用域命令對象(請求包裝)

回答

1

最直接的是落實在你的ModelView接口。然後你的遺留控制器可以直接返回這個類(就像他們現在這樣),它將通過調用render方法由DispatcherServlet呈現。

另一種可能性是實現自己的HandlerMethodReturnValueHandler,其中處理器實際上可以呈現響應並標記響應,處理(mavContainer.setRequestHandled(true);),以便DispatcherServlet不會嘗試提供任何看法。

+0

非常感謝!非常簡單的解決方案和作品 – user979051

0

我認爲你想要做的是創建一個自定義的ViewResolver,輸出你的JSON響應。這將在Spring MVC中進行配置,以設置ViewResolver列表,將您置於頂部以獲得更多優先級。它應該工作的方式(從我的回憶中)是Spring MVC將從列表頂部開始,並嘗試每個ViewResolver,直到找到一個返回處理返回類型的ViewResolver。你將不得不穀歌如何使自定義ViewResolvers,因爲我只使用它們,從來沒有創建一個,但我知道這是一個接口,所以它應該是可行的。我相信這將是實現這一點的唯一方法,不需要在控制器中進行任何代碼更改。

更多的「首選」的方法來做JSON,然而,就是有傑克遜在類路徑和簡單地返回要序列化到JSON對象。 Spring會自動將其轉換爲JSON,我相信使用它們提供的ViewResolver。但是,我確實可能會涉及到不想重構大量有效的代碼。