framework example español ejemplo java spring spring-3 spring-annotations

java - example - spring reference español



¿Cómo registrar la clase anotada Spring @Configuration en lugar del archivo applicationContext.xml en web.xml? (2)

Componiendo una vieja pregunta aquí, pero con versiones recientes de Spring (v3.0 +) ahora puede deshacerse de web.xml por completo, siempre que esté implementando su aplicación en un contenedor web que sea compatible con Servlet 3.0+.

Uno puede implementar Spring WebApplicationInitializer interfaz para hacer las mismas configuraciones que uno haría en web.xml. Esta clase de implementación será detectada automáticamente por la aplicación Spring 3.0+ que se ejecuta en contenedores Servlet 3.0+.

Si la configuración es bastante simple, podría utilizar otra clase proporcionada por Spring como se muestra a continuación. Todo lo que hace aquí es establecer las clases @Configuration y enumerar las asignaciones de servlets. Mantiene la configuración extremadamente simple.

public class WebInit extends AbstractAnnotationConfigDispatcherServletInitializer{ @Override protected Class<?>[] getRootConfigClasses() { return null; } @Override protected Class<?>[] getServletConfigClasses() { return new Class[] {AppConfig.class}; } @Override protected String[] getServletMappings() { return new String[] { "*.html" ,"*.json" ,"*.do"}; } }

Estoy usando jsf y spring juntos en la aplicación web. He configurado el origen de datos y la fábrica de sesiones en una clase de configuración que utiliza anotaciones como @Configuration, @ComponentScan etc. No tengo ningún archivo applicationContext.xml en mi proyecto, ya que estoy manejando cada entrada de contexto xml en la clase de configuración. El caso de prueba funciona con éxito, pero cuando despliego mi aplicación web, me da error

java.lang.IllegalStateException: no se encontró WebApplicationContext: no se ha registrado ContextLoaderListener?

Ahora si doy clase de oyente en web.xml,

<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>

me da error,

/WEB-INF/applicationContext.xml no encontrado

Según el documento de ContextLoaderListener , es cierto que si no doy contextConfigLocation param en web.xml explícitamente, buscará el archivo de contexto de primavera predeterminado denominado applicationContext.xml en web.xml . Ahora, ¿qué debo hacer si no quiero usar el archivo de contexto de primavera y hacer toda la configuración con anotaciones? ¿Cómo debo registrar la clase de escucha ContextLoaderListener para que, sin el uso de un archivo xml y el uso de anotaciones solamente, pueda ejecutar mi aplicación web con spring y jsf?


En web.xml , necesita iniciar el contexto con AnnotationConfigWebApplicationContext :

<servlet> <servlet-name>appServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextClass</param-name> <param-value> org.springframework.web.context.support.AnnotationConfigWebApplicationContext </param-value> </init-param> <init-param> <param-name>contextConfigLocation</param-name> <param-value> org.package.YouConfigurationAnnotatedClass </param-value> </init-param> </servlet>

Y no te olvides de usar @EnableWebMvc para que tus anotaciones MVC @EnableWebMvc .

Otras lecturas:

EDITAR como un "seguimiento de comentarios" => para ser Turing completo:

Sí, por supuesto, necesitas un oyente. Aunque lo anterior responde completamente a la pregunta " Cómo registrar la clase anotada Spring @Configuration en lugar del archivo applicationContext.xml en web.xml ", aquí hay un example de la documentación oficial de Spring que presenta el web.xml completo:

<web-app> <!-- Configure ContextLoaderListener to use AnnotationConfigWebApplicationContext instead of the default XmlWebApplicationContext --> <context-param> <param-name>contextClass</param-name> <param-value> org.springframework.web.context.support.AnnotationConfigWebApplicationContext </param-value> </context-param> <!-- Configuration locations must consist of one or more comma- or space-delimited fully-qualified @Configuration classes. Fully-qualified packages may also be specified for component-scanning --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>com.acme.AppConfig</param-value> </context-param> <!-- Bootstrap the root application context as usual using ContextLoaderListener --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- Declare a Spring MVC DispatcherServlet as usual --> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- Configure DispatcherServlet to use AnnotationConfigWebApplicationContext instead of the default XmlWebApplicationContext --> <init-param> <param-name>contextClass</param-name> <param-value> org.springframework.web.context.support.AnnotationConfigWebApplicationContext </param-value> </init-param> <!-- Again, config locations must consist of one or more comma- or space-delimited and fully-qualified @Configuration classes --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>com.acme.web.MvcConfig</param-value> </init-param> </servlet> <!-- map all requests for /app/* to the dispatcher servlet --> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/app/*</url-pattern> </servlet-mapping> </web-app>