2010-09-12 3 views
15

Do tej pory <mvc:annotation-driven /> spowodował dla mnie wiele problemów, więc chciałbym się go pozbyć. Chociaż spring framework docs clearly say what it is supposed to be doing brakuje listy znaczników faktycznie podsumowujących <mvc:annotation-driven />.Howto pozbyć się <mvc: adnotacja sterowana />?

więc utknąłem z usuwaniem <mvc:annotation-driven /> i teraz otrzymuję błąd

WARN osweb.servlet.PageNotFound - Nie mapowanie znalezionych dla żądania HTTP z URI [/ webapp/stażystów] w DispatcherServlet o nazwie „workoutsensor”

dla wszystkich adresów URL ma być rozwiązany przez klasy kontrolera (w tym przypadku: ./trainees). Wszelkie sugestie, gdzie mogę przeczytać więcej na temat <mvc:annotation-driven />? Rozpaczliwie chciałbym wiedzieć, jakie znaczniki są reprezentowane przez <mvc:annotation-driven />.

Odpowiedz

26

Możesz użyć BeanPostProcessor, aby dostosować każdy komponent bean zdefiniowany przez <mvc:annotation-driven />. Teraz javadocs wyszczególnia wszystkie ziarna, które rejestruje znacznik.

Jeśli naprawdę chcą się go pozbyć, można spojrzeć na kodzie źródłowym org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser

I można zobaczyć, które fasola jest to definiowania. Robiłem to „ćwiczenia” (nie dla wszystkich, ale dla tych, muszę), więc oto one:

<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"> 

Teraz powyżej widać CommonWebBindingInitializer. Musisz utworzyć tę klasę, aby używać konwersji i sprawdzania poprawności:

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); 
    } 

} 

I to działa dobrze dla mnie do tej pory. Zachęcamy do zgłaszania wszelkich problemów.

+0

Dzięki Bozho, to jest tylko wejście, którego potrzebuję. Jestem pewien, że napotkam kolejne problemy z konfiguracją, w szczególności implementując . Nie zawaham się ich zgłaszać ;-) –

+1

Ach, jest tam link Fisheye, którego szukałem. :] – earldouglas

+1

Źródło BTW 'AnnotationDrivenBeanDefinitionParser' można również oglądać na GitHub: https://github.com/cbeams/spring-framework/blob/master/org.springframework.web.servlet/src/main/java/org/springframework /web/servlet/config/AnnotationDrivenBeanDefinitionParser.java –

5

Jeśli chcesz uniknąć tag mvc:annotation-driven, można po prostu stworzyć sobie DefaultAnnotationHandlerMapping i AnnotationMethodHandlerAdapter fasolę, ale wygląda na to, że byłoby lepiej, aby dostać się do źródła swoich problemów z samym znacznikiem.

Jakie są objawy Twojego problemu? Co próbujesz zrobić ze swoją aplikacją Spring MVC?

Jeśli chcesz wiedzieć, co dzieje się pod kołdrą, gdy używasz mvc: adnotacja sterowana, zobacz metodę AnnotationDrivenBeanDefinitionParser.parse().

+1

"Jakie są objawy Twojego problemu?" - O, to jest tak, że za każdym razem, gdy dostosowuję interfejs bezpieczeństwa sprężynowego (np. UserDetailsManager), pojawia się błąd "podwójnie zdefiniowany".Albo kiedy próbuję zdefiniować własne aspekty, moje nigdy nie są czytane, ponieważ wiosna używa własnych. Ponadto czuję się lepiej, mając większą kontrolę nad tym, co koduję. Konwencja nad konfiguracją to wspaniała rzecz ... jeśli wiesz, czym jest konwencja ;-) –

3

Stare pytanie wiem, ale to może komuś pomóc. Dzięki postom na tej stronie, a także over here użyłem następujących elementów, aby zastąpić tag sterowany adnotacjami w aplikacji Roo 1.2. Kopacze dla mnie wymagały konwersji typu wsparcia w widoku listy aplikacji 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

Wiosna 3.1 wprowadziła [nowe klasy wsparcia] (http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/mvc.html# mvc-ann-requestmapping-31-vs-30) dla @RequestMapping, które powinny być użyte ", aby skorzystać z nowych funkcji Spring MVC 3.1". Zaktualizowałem ten przykład. – sbk

2

Podczas przesuwania należy zachować ostrożność, aby uwzględnić nadpisanie niestandardowego zarządzania wykonaniem. W przeciwnym razie wszystkie niestandardowe mapowania wyjątków się nie powiedzie. Będziesz musiał ponownie użyć messageCoverters z listą komponentów:

<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>