Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring MVC,从控制器内部调用另一个控制器_Java_Spring_Spring Mvc - Fatal编程技术网

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

Java Spring MVC,从控制器内部调用另一个控制器,java,spring,spring-mvc,Java,Spring,Spring Mvc,我正在处理一个现有代码,该代码使用一个控制器调用第二个控制器上的方法。到目前为止,我已经看到了两个实现 第一次实施 return new Controller().method(request, response); @Autowired private Controller controller. return this.controller.method(request, response); 第二次实施 return new Controller().method(request,

我正在处理一个现有代码,该代码使用一个控制器调用第二个控制器上的方法。到目前为止,我已经看到了两个实现

第一次实施

return new Controller().method(request, response);
@Autowired
private Controller controller.

return this.controller.method(request, response);
第二次实施

return new Controller().method(request, response);
@Autowired
private Controller controller.

return this.controller.method(request, response);

哪一个是正确的实现,哪一个有什么问题。

第二个是正确的,因为您不会每次都使用它。@Autowired注释在需要时将对象注入到代码中

检查这个


但是有一个@Controller注释,您应该将它用于要自动连线的控制器和@Service for bean。

第一个需要更多的工作,首先,您真的想每次都创建一个新的Controller类实例吗


第二种是使用一种称为依赖注入或控制反转的模式,这种模式更好。让spring为您管理bean的作用域,默认情况下,它将只创建控制器类的一个实例,但是如果在某个时候(出于某种原因)您不希望这种行为,那么创建多个实例就很简单了…

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

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


使用选项1,您将失去Spring DI容器带给您的一切:即,Spring可能会实例化其他控制器,并将其他一些依赖项连接到其中。如果您自己实例化它,即使它现在确实可以工作,因为您可能没有@Autowired/@Value依赖项,一旦您添加对其他资源的依赖项,它就会中断。此外,您已经有了一个为您构建的容器实例,为什么还要创建其他实例呢?

您完全错了。请参阅Costi Ciudatu的错误答案

解决方案:我建议您将
服务层和dao层类
控制器
相关联。 假设您有
AccountController
,您将有
AccountService
类(接口+实现)和
AccountDao
(接口+实现)


现在,如果用户登录(
LoginController
)并且您需要帐户,那么您将在
LoginController
中自动连接
AccountService
,您将从
AccountService
方法中获取用户帐户的详细信息。

如果您在控制器之间进行调用,则可能存在缺陷或您希望进行重定向,这是完全正确的。 如果是重定向,只需在控制器方法中返回,如下所示:

return "redirect:/yourDestinationControllerPath";

这有什么好处?这样做打破了很多惯例,您应该考虑修改,即分解控制器代码,可能将一些逻辑移到业务层。为什么不转发?我想这确实取决于您的意图,Redict:将从客户端(浏览器)发出另一个请求并更改URL:转发全部发生在服务器端,无需额外请求,但不更改URL。我甚至不确定在问题被回答时是否存在“前进”:pit并非每次都可行。