2012-10-11 318 views
7

Estoy trabajando en un código existente que está utilizando un controlador para llamar a un método en el 2 ° controlador. Hay 2 implementaciones que he visto hasta ahora.Spring MVC, llamando a otro controlador desde Dentro de un controlador

primera implementación

return new Controller().method(request, response); 

segundo Implementación

@Autowired 
private Controller controller. 

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

¿Cuál es la aplicación correcta, ¿cuáles son los problemas si alguno con ninguno de ellos.

+0

¿Cuál es la ventaja de esto? Hacerlo rompe una gran cantidad de convenciones, y debería considerar la revisión, es decir, dividir el código del controlador y tal vez mover parte de la lógica a la capa empresarial. – dardo

Respuesta

9

El simple hecho de que necesite llamar a un método desde otro controlador revela un probable defecto de diseño.

Con la opción 1, pierde todo lo que le trajo el contenedor Spring DI: es decir, ese otro controlador puede ser instanciado por Spring con algunas otras dependencias conectadas a él. Si lo instancia usted mismo, incluso si funciona en este momento, porque probablemente no tenga dependencias @Autowired/@Value, se romperá una vez que agregue dependencias a otros recursos. Además, ya tienes una instancia del contenedor creado para ti, ¿por qué crear otros?

1

La primera necesita más trabajo, en primer lugar, ¿realmente desea crear una nueva instancia de la clase Controlador siempre?

El segundo usa un patrón conocido como inyección de dependencia o inversión de control que es más agradable. Deje que la primavera administre el alcance del bean, de forma predeterminada solo creará 1 instancia de la clase Controller, pero si en algún momento (por alguna razón) no desea este comportamiento, es fácil crear muchas instancias ...

9

Parece que necesita refactorizar el código. Extraiga lo que es común entre los dos controladores en una clase separada, y luego invoque eso desde cualquiera de los controladores.

+2

+1 para buenas prácticas, y para ser de Milwaukee, y básicamente para reiterar mi comentario. – dardo

4

Lo está haciendo completamente mal. Ver Costi Ciudatu's respuesta para lo que está mal.

Solución: Te aconsejo tener service layer and dao layer classes asociado a tu controllers. Supongamos que tiene AccountController, tendrá AccountService clase (interfaz + implementación) y AccountDao (interfaz + implementación).

Ahora bien, si usuario inicia sesión (LoginController) y necesitas cuenta para que se Autowire AccountService en LoginController, obtendrá detalles de la cuenta de usuario de AccountService métodos.

9

Si realiza una llamada entre Controladores, o bien hay un error o desea hacer una redirección, que es totalmente válido.Si redirección es el caso que acabamos de regresar de su método de controlador de la siguiente manera:

return "redirect:/yourDestinationControllerPath"; 
Cuestiones relacionadas