2011-08-26 20 views
5

Mi proyecto incluye controladores sin anotaciones más antiguos junto con controladores más recientes basados ​​en anotaciones.<mvc: annotation-driven /> con controladores sin anotación

Estoy utilizando los últimos Spring jars (3.0.5) y en mi dispatcher-servlet.xml hay <mvc:annotation-driven />.

El problema es que <mvc:annotation-driven /> hace que la asignación de solicitudes (a través de la propiedad del nombre de los beans del controlador en el dispatcher-servlet.xml) a mis controladores no anotados no funcione ... cada vez que dirijo la solicitud a un controlador-anotado Recibo un mensaje de error como:

org.springframework.web.servlet.DispatcherServlet noHandlerFound 
WARNING: No mapping found for HTTP request with URI [/some_path/some_page.htm] in DispatcherServlet with name 'dispatcher' 

¿Cómo puedo mantener los controladores-anotado como son, sino decirle primavera para reconocer su asignación (estilo antiguo)?

Estoy buscando soluciones con un cambio mínimo en el código de Java de los controladores que ya tengo.

Gracias!

Respuesta

6

Cuando agrega <mvc:annotation-driven /> a su configuración, reemplaza el conjunto predeterminado de asignaciones de controlador y adaptadores de controlador, y esos valores predeterminados fueron los que manejaron los controladores antiguos.

Tiene 2 opciones. Lo primero que debe hacer es eliminar <mvc:annotation-driven />. Aún puede usar controladores anotados sin esto. Agrega funciones adicionales como el soporte Jackson JSON, pero si no necesita esas características adicionales, entonces no las necesita. Pruebe su aplicación sin <mvc:annotation-driven /> y vea si todavía funciona.

De lo contrario, puede restablecer las asignaciones y adaptadores para sus controladores anteriores. Usted no ha dicho cómo sus controladores solía tener sus direcciones URL asignada, pero trate de añadir de inmediato a su configuración:

<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> 
<bean class="org.springframework.web.servlet.handler.ControllerClassNameHandlerMapping"/> 

Si utilizó SimpleUrlHandlerMapping, a continuación, que deben estar trabajando ya.

también hay que añadir el HandlerAdapter de vuelta en:

<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> 

No se limite a añadir estos a ciegas. Pruébelas individualmente y vea cuál es el conjunto mínimo para que sus viejos controladores funcionen junto con los nuevos.

+0

Gracias por esta respuesta tan útil. Mis controladores anteriores usaban el método name = url para mapear, así que agregué BeanNameUrlHandlerMapping a mi dispatcher-servlet.xml y ahora funciona nuevamente.Después de su respuesta, me tomé un tiempo para leer sobre asignaciones de manejadores y adaptadores de manejador (no los conocía). Ahora mi pregunta es en Spring 3, ¿qué asignaciones de controlador y adaptadores de controlador se definen automáticamente? Supongo que DefaultAnnotationHandlerMapping & AnnotationMethodHandlerAdapter pero cualquier otro? ¿Podría dirigirme a dónde se menciona en la documentación y/o el código? ¡Gracias de nuevo! – rapt

6

Descubrí que al explotar el mvc: anotado en su reemplazo real, era más fácil de entender.

<mvc:annotation-driven /> explota a esto:

<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" /> 
     </list> 
    </property> 
</bean> 

<!-- Configures a validator for spring to use --> 
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> 
    <property name="messageInterpolator"> 
     <bean class="com.eps.web.spring.validation.SpringMessageSourceMessageInterpolator" /> 
    </property> 
</bean> 

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

Una vez que la magia se había ido, tengo este error al intentar cargar un "viejo" controlador: javax.servlet.ServletException: No adapter for handler [or[email protected]

A partir de ese momento, añaden

<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" /> 

Y todos mis viejos controladores funcionaban.

+0

Gracias, Brad, por tu solución. Funcionó para mí Es interesante que si pongo "mvn: anotado por impulsos" en la configuración, aparece el mensaje de error "La aplicación tiene un bucle de redireccionamiento", pero la versión explotada funciona correctamente. –

+0

Estaba usando SimpleUrlHandlerMapping para los controladores anteriores. Con Spring 2.5. ¡Agregando lo siguiente en habilitado tanto el controlador anotado como el antiguo funciona como un pedazo de pastel! \t . ¡Gracias! – JackDev

+0

¿Alguien ha preguntado por qué funcionó su solución? ¿Fue porque Spring venía con un conjunto de adaptadores predeterminado y la definición de "AnnotationMethodHandlerAdapter" simplemente sobrescribía la configuración predeterminada del adaptador? – JackDev

Cuestiones relacionadas