2010-11-22 20 views
6

En mi web.xml que tienen una "SpringMVC" declaración servlet (que tiene un correspondiente SpringMVC-servlet.xml)Aplicación primavera Contexto Orden de carga

<servlet> 
    <servlet-name>springmvc</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
</servlet> 

<servlet-mapping> 
    <servlet-name>springmvc</servlet-name> 
    <url-pattern>/myapp/*</url-pattern> 
</servlet-mapping> 

También tengo mi archivo applicationContext.xml habitual.

¿Cuál se carga primero? ¿Springmvc-servlet.xml o applicationContext.xml?

La razón por la que estoy preguntando esto es cada vez que coloco el elemento <mvc:annotation-driven/> en applicationContext.xml, obtengo un error de contexto grave. Pero cuando pongo ese elemento en springmvc-servlet.xml, mi aplicación web funciona bien.

¿Alguna idea de por qué?

En otra aplicación web, tengo <mvc:annotation-driven/> dentro de applicationContext.xml y funciona bien.

Adición: me di cuenta que la presencia de AOP: config plantea conflicto contra MVC: anotación impulsada

+0

Copie el seguimiento de la pila de excepciones a su pregunta. ¿Ha definido xsd para el espacio de nombres mvc en applicationContext.xml? – MarrLiss

+0

No hay ningún rastro de pila. Solo recibo el típico error de contexto grave de Tomcat. – chris

Respuesta

0

excepción de web.xml no hay un orden predefinido. Esto sucede :

  • web.xml se carga por el motor de servlets, esto dispara la carga de todos los servlets, filtros, oyentes definidos,
  • la ContextLoaderListener carga el raíz de contexto de la aplicación XML, este podrían incluir una definición de frijol para un LocalSessionFactoryBean , lo que provocó la carga de todos XML de mapeo de Hibernate archivos
  • la DispatcherServlet carga el aplicación web XML contexto

Estudia el web.xml para determinar el orden en cada caso.

ver también:

link

+0

En mi web.xml solo tengo el xxxxx-servlet.xml. No declare ningún otro archivo Spring XML. La aplicaciónContext.xml se carga de manera predeterminada sin ninguna configuración especial. Realmente no sé por qué funciona en algunas aplicaciones en función de su ubicación – chris

+0

Estoy digiriendo esta información y actualmente estoy probando ... Creo que estoy metido en algo – chris

+0

Muy bien, me alegro de que esta información te esté ayudando . – Michel

5

el contexto applicationContext.xml es el padre al contexto dispatcher-servlet.xml. No sé si esto significa que está cargado primero, pero no importa en su caso:

<mvc:annotation-driven /> debe estar en el dispatcher-servlet.xml, porque pertenece a la parte web de la aplicación.

+0

Basado en la observación, no lo creo. Tengo una aplicación web donde está en applicationContext.xml. De hecho, si pongo el xxxxx-servlet, obtengo el error SEVERE CONTEXT. Necesito ese elemento porque mis Controladores y Administradores están marcados usando las anotaciones @Controller y @Service respectivamente – chris

+0

@ chris. ¿Qué le parece compartir el mensaje exacto y el rastro de la excepción del servicio? – Bozho

0

Es probable que tenga que añadir el espacio de nombres MVC para el contexto de aplicación:

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xsi:schemaLocation=" 
     http://www.springframework.org/schema/mvc 
     http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd" 
> 

otros espacios de nombres (despojados)

+0

Ya los tengo. Eclipse se quejará automáticamente cuando me falten esos esquemas – chris

+0

Pensé que sí, pero solo estaba revisando, para ver si estaba completo. –

3

he resuelto mi problema!

Resulta que no tiene nada que ver con la orden de carga o donde se declara el <mvc:annotation-driven/>.

Intenté implementar mi aplicación web en otro Tomcat y, para mi sorpresa, hay un seguimiento de la pila en el registro del host local. Tuve una pista por prueba y error de que el conflicto es con <aop:config/>. Pero, ¿qué conflicto en particular?

Después vi este error en el archivo de registro:

java.lang.ClassCastException: org.aspectj.weaver.ResolvedType$Array cannot be cast to org.aspectj.weaver.ReferenceType 

así que tenemos una excepción de difusión. Busqué en Google ese error exacto anterior y encontré esto: Spring 3: adding causes ClassCastException

Parece que el iniciador de subprocesos y yo tenemos el mismo problema exacto. Así que descargué el aspectj-1.6.10.jar pero todavía me faltaba una clase. Entonces resulta que debería ser el aspectjweaver-1.6.9

Todavía estaba usando un aspecto muy antiguo. No tenía ninguna versión sobre su nombre. Problema resuelto. Caso cerrado.

Por cierto como prima, he desenrollé manualmente el elemento <mvc:annotation-driven/> a su equivalente declaración XML:

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> 
    <property name="order" value="0" /> 
</bean> 

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    <property name="webBindingInitializer"> 
     <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"> 
      <property name="validator" ref="validator" /> 
     </bean> 
    </property> 
    <property name="messageConverters"> 
     <list> 
      <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" /> 
      <bean class="org.springframework.http.converter.StringHttpMessageConverter" /> 
      <bean class="org.springframework.http.converter.FormHttpMessageConverter" /> 
      <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter" /> 
      <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" /> 
     </list> 
    </property> 
</bean> 

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" /> 
<bean id="conversion-service" class="org.springframework.format.support.FormattingConversionServiceFactoryBean" /> 

Son exactamente lo mismo cuando se declara la <mvc:annotation-driven/> en base a lo que he investigado .

Gracias a todos los que me ayudaron.

Cuestiones relacionadas