Spring MVC: ¿diferencia entre las etiquetas <context: component-scan> y <annotation-driven />? [duplicar
Esta pregunta ya tiene una respuesta aquí:
¿Por qué Spring MVC responde con un 404 e informa "No se encontró ninguna asignación para la solicitud HTTP con URI [...] en DispatcherServlet"? 6 respuestasace unos días comencé a estudiar este Tutorial de Spring Hello World:http: //viralpatel.net/blogs/spring-3-mvc-create-hello-world-application-spring-3-mvc
En este tutorial Spring DispatcherServlet se configura usando el spring-servlet.xml archivo, este:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="net.viralpatel.spring3.controller" />
<bean id="viewResolver"
class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
En este archivo estoy usando lacontext: componente-scan etiqueta para decir que Spring tiene que escanear mi archivo buscando la anotación, por ejemplo, cuando la clase de controlador encuentra que un método está anotado por@ RequestMapping ("/ hello") annotation sabe que este método maneja la solicitud HTTP hacia la URL que termina con "/ hello". Esto es simple..
Ahora mi duda está relacionada con el proyecto de plantilla Spring MVC que podría construir automáticamente en STS \ Eclipse.
Cuando creo un nuevo proyecto Spring MVC en STS tengo que mi DispatcherServlet está configurado por un archivo llamado servlet-context.xml que contiene alguna configuración similar al archivo de ejemplo anterior.
En este archivo, todavía tengo la etiqueta de escaneo de componentes:
<context:component-scan base-package="com.mycompany.maventestwebapp" />
pero también tengo otra etiqueta (que parece tener una tarea similar), esta:
<annotation-driven />
¿Cuál es la diferencia entre estas dos etiquetas?
Otra cosa "extraña" es que el ejemplo anterior (que no usa la etiqueta basada en anotaciones) es muy similar al proyecto creado por STS usando el proyecto Spring MVC Template pero si elimino la etiqueta basada en anotaciones de su archivo de configuración el proyecto no se ejecuta y me da el siguiente error:HTTP Estado 404 -
Y en el stacktrace tengo:
WARN: org.springframework.web.servlet.PageNotFound: no se encontró ninguna asignación para la solicitud HTTP con URI [/ maventestwebapp /] en DispatcherServlet con el nombre 'appServlet'
¿Pero por qué? El ejemplo anterior funciona bien sin etiquetas controladas por anotaciones, y esta clase de controlador es muy similar. De hecho, solo hay un método que maneja la solicitud HTTP hacia la ruta "/"
Este es el código de mi clase de controlador:
package com.mycompany.maventestwebapp;
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
/**
* Handles requests for the application home page.
*/
@Controller
public class HomeController {
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
/**
* Simply selects the home view to render by returning its name.
*/
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Locale locale, Model model) {
logger.info("Welcome home! The client locale is {}.", locale);
Date date = new Date();
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
String formattedDate = dateFormat.format(date);
model.addAttribute("serverTime", formattedDate );
return "home";
}
¿Alguien puede ayudarme a entender esto?
¡Muchas gracias