Spring MVC,从控制器内部调用另一个控制器

3co*_*ins 13 java spring spring-mvc

我正在使用一个控制器来调用第二个控制器上的方法的现有代码.到目前为止我已经看到了2个实现.

第一次实施

return new Controller().method(request, response);
Run Code Online (Sandbox Code Playgroud)

第二次实施

@Autowired
private Controller controller.

return this.controller.method(request, response);
Run Code Online (Sandbox Code Playgroud)

哪个是正确的实现,如果有任何问题,有什么问题.

Cos*_*atu 15

您需要从另一个控制器调用方法这一事实揭示了可能的设计缺陷.

使用选项1,您将丢失Spring DI容器带给您的所有内容:即,其他控制器可能由Spring实例化,其中一些其他依赖项连接到它.如果您自己实例化它,即使它在此时确实有效,因为您可能没有@Autowired/@Value依赖项,一旦您在其他资源上添加依赖项,它就会中断.此外,您已经有一个为您构建容器的实例,为什么要创建其他容器?


Die*_*rte 14

如果您在控制器之间进行呼叫,则存在缺陷或您想要进行重定向,这是完全有效的.如果是重定向,只需在控制器方法中返回如下:

return "redirect:/yourDestinationControllerPath";
Run Code Online (Sandbox Code Playgroud)

  • 为什么不前进? (2认同)
  • 我想这真的取决于您的意图,redirect:将从客户端(浏览器)发出另一个请求并更改 URL。:forward 全部发生在服务器端,不需要额外的请求,但不改变 URL。我什至不确定在回答问题时 :forward 是否存在:p (2认同)

Mar*_*all 9

听起来你需要重构代码.将两个控制器之间的共同点提取到一个单独的类中,然后从任一控制器调用它.

  • 良好练习+1,来自密尔沃基,并且基本上重申了我的评论. (3认同)
  • 并不是每次都可行。 (2认同)

Nan*_*ale 5

你做的完全错了。Costi Ciudatu's有什么问题请看答案。

解决方案:你已经我的意见service layer and dao layer classes与你有关controllers。假设你有AccountController,你会有AccountService类(接口+实现)和AccountDao(接口+实现)。

现在,如果在用户登录(LoginController),你需要帐户,以便将自动装配AccountServiceLoginController,你会得到用户的账户信息AccountService的方法。