2013-06-03 130 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。但是,我确实可能会涉及到不想重构大量有效的代码。