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>