0

I am refactoring a legacy application to use Spring MVC. All of my controllers (legacy) return an object of type Model and my legacy dispatcher write the output of model.getContent(), the method getContent does internal processing and returns a json string. I have hundreds of controllers and do not want to rewrite them. Is it possible to write a custom view handler and include it in the spring servlet config?

Sample Controller:

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

I'm planning to annotate as @Controller. Specify the @RequestMapping or in the xml config, remove the base class BasicAction (legacy mvc). I've recently introduced spring to this project and refactored to use Dependency Injection and Request Scoped command objects (request wrappers)

4

2 回答 2

1

最直接的方法是在您的类上实现View接口。Model然后你的遗留控制器可以直接返回这个类(就像现在一样),它将DispatcherServlet通过调用它的render方法来呈现。

另一种可能性是实现您自己的HandlerMethodReturnValueHandler,其中处理程序可以实际呈现响应并将响应标记为已处理(mavContainer.setRequestHandled(true);),这样DispatcherServlet就不会尝试呈现任何视图。

于 2013-06-03T20:51:16.450 回答
0

我认为您想要做的是创建一个自定义 ViewResolver 来输出您的 JSON 响应。这将在 Spring MVC 中配置为设置 ViewResolver 列表,将您的列表置于顶部以获得更多优先级。它应该工作的方式(根据我的回忆)是 Spring MVC 将从列表的顶部开始,并尝试每个 ViewResolver 直到找到一个返回处理返回类型的那个。您将不得不谷歌如何制作自定义 ViewResolver,因为我只使用过它们,从未创建过,但我知道它是一个界面,所以它应该是可行的。我相信这将是唯一不需要在控制器中更改任何代码的方法。

然而,更“首选”的 JSON 方法是让 Jackson 在你的类路径中,然后简单地将你想要序列化的对象返回为 JSON。Spring 会自动将其转换为 JSON,我相信使用他们提供的 ViewResolver。但是,我可以肯定地与不想重构大量工作代码有关。

于 2013-06-03T20:25:44.853 回答