2010-09-12 6 views
15

Hasta ahora, <mvc:annotation-driven /> me ha causado muchos problemas, así que me gustaría deshacerme de él. Aunque el spring framework docs clearly say what it is supposed to be doing, falta una lista de etiquetas realmente <mvc:annotation-driven />.¿Cómo deshacerse de <mvc: annotation-driven />?

Así que estoy atascado con la eliminación de <mvc:annotation-driven /> y ahora recibiendo el error

WARN osweb.servlet.PageNotFound - encontró ninguna asignación para la petición HTTP con URI [/ webapp/aprendices] en DispatcherServlet con el nombre 'workoutsensor'

para todas las URLs supuestos a ser resueltos por las clases de controlador (en este caso: ./trainees). ¿Alguna sugerencia en la que pueda leer más sobre <mvc:annotation-driven />? Desesperadamente me gustaría saber qué etiquetas están representadas exactamente por <mvc:annotation-driven />.

Respuesta

26

Puede usar BeanPostProcessor para personalizar cada bean definido por <mvc:annotation-driven />. Los javadocs ahora detallan todos los beans que registra la etiqueta.

Si realmente quiere deshacerse de ella, se puede ver en el código fuente de org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser

Y se puede ver lo que los granos se está definiendo. He hecho esto 'ejercicio' (no para todos ellos, pero para aquellos que necesito), así que aquí están ellos:

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

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
     <property name="webBindingInitializer"> 
      <bean class="com.yourpackage.web.util.CommonWebBindingInitializer" /> 
     </property> 
     <property name="messageConverters"> 
      <list> 
       <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" /> 
       <bean class="org.springframework.http.converter.ResourceHttpMessageConverter" /> 
       <bean class="org.springframework.http.converter.StringHttpMessageConverter" /> 
       <bean class="org.springframework.http.converter.feed.AtomFeedHttpMessageConverter" /> 
       <bean class="org.springframework.http.converter.feed.RssChannelHttpMessageConverter" /> 
       <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" /> 
       <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter" /> 
       <bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter" /> 
       <!-- bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter" /--> 
      </list> 
     </property> 
    </bean> 
<bean id="handlerMapping" 
    class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> 

Ahora, sobre el que se ve CommonWebBindingInitializer. Tienes que crear esta clase, para usar la conversión y la validación:

public class CommonWebBindingInitializer implements WebBindingInitializer { 

    @Autowired 
    private Validator validator; 

    @Autowired 
    private ConversionService conversionService; 

    @Override 
    public void initBinder(WebDataBinder binder, WebRequest request) { 
     binder.setValidator(validator); 
     binder.setConversionService(conversionService); 
    } 

} 

Y esto funciona bien para mí hasta ahora. No dude en informar cualquier problema con él.

+0

Gracias Bozho, esa es solo la información que necesito. Estoy bastante seguro de que me encontraré con más problemas de configuración, en particular, implementando . No dudaré en denunciarlos ;-) –

+1

Ah, está el enlace Fisheye que estaba buscando. :] – earldouglas

+1

BTW La fuente 'AnnotationDrivenBeanDefinitionParser' se puede ver también en GitHub: https://github.com/cbeams/spring-framework/blob/master/org.springframework.web.servlet/src/main/java/org/springframework /web/servlet/config/AnnotationDrivenBeanDefinitionParser.java –

5

Si se quiere evitar la etiqueta mvc:annotation-driven, sólo tiene que crear DefaultAnnotationHandlerMapping y AnnotationMethodHandlerAdapter granos de ti mismo, pero suena como que sería mejor para llegar a la raíz de sus problemas con la propia etiqueta.

¿Cuáles son los síntomas de su problema? ¿Qué estás tratando de hacer con tu aplicación Spring MVC?

Si quiere saber qué está pasando debajo de las cubiertas cuando usa mvc: anotación controlada, vea el método AnnotationDrivenBeanDefinitionParser.parse().

+1

"¿Cuáles son los síntomas de su problema?" - O, es solo que cada vez que personalizo una interfaz de seguridad de primavera (por ejemplo, UserDetailsManager) aparece un error "doblemente definido".O cuando intento definir mis propios aspectos, los míos nunca se leen porque la primavera usa los suyos. Además, me siento mejor teniendo más control sobre lo que codigo. La convención sobre configuración es una gran cosa ... si sabes cuál es la convención ;-) –

3

Vieja pregunta que sé, pero esto puede ayudar a alguien. Gracias a las publicaciones en esta página y también al over here, utilicé lo siguiente para reemplazar la etiqueta impulsada por anotaciones en la aplicación Roo 1.2. Ellos patearon para mí la conversión de tipo de soporte que necesitaba en la vista de la lista de aplicaciones roo.

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

<bean id="conversionServiceExposingInterceptor" 
    class="org.springframework.web.servlet.handler.ConversionServiceExposingInterceptor"> 
    <constructor-arg ref="conversionService" /> 
</bean> 

<bean 
    class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"> 
    <property name="order" value="0" /> 
    <property name="interceptors"> 
     <list> 
      <ref bean="conversionServiceExposingInterceptor" /> 
     </list> 
    </property> 
</bean> 

<bean 
    class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> 
    <property name="webBindingInitializer"> 
     <bean 
      class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"> 
      <property name="conversionService" ref="conversionService" /> 
      <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> 
+0

Spring 3.1 introducido [nuevas clases de soporte] (http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/mvc.html# mvc-ann-requestmapping-31-vs-30) para @RequestMapping que se debería usar "para aprovechar las nuevas características Spring MVC 3.1". Han actualizado este ejemplo. – sbk

2

Si bien prevalece, tenga en cuenta también la anulación de gestión de ejecución personalizada. De lo contrario, todas las asignaciones de excepciones personalizadas fallarán. Tendrá que reutilizar messageCoverters con un bean de lista:

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

<util:list id="messageConverters"> 
    <bean class="your.custom.message.converter.IfAny"></bean> 
    <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"></bean> 
    <bean class="org.springframework.http.converter.StringHttpMessageConverter"></bean> 
    <bean class="org.springframework.http.converter.ResourceHttpMessageConverter"></bean> 
    <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"></bean> 
    <bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"></bean> 
    <bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"></bean> 
    <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean> 
</util:list> 

<bean name="exceptionHandlerExceptionResolver" 
     class="org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver"> 
    <property name="order" value="0"/> 
    <property name="messageConverters" ref="messageConverters"/> 
</bean> 

<bean name="handlerAdapter" 
     class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> 
    <property name="webBindingInitializer"> 
     <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"> 
      <property name="conversionService" ref="conversionService" /> 
      <property name="validator" ref="validator" /> 
     </bean> 
    </property> 
    <property name="messageConverters" ref="messageConverters"/> 
</bean> 

<bean id="handlerMapping" 
     class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"> 
</bean> 
Cuestiones relacionadas