2010-09-12 10 views
15

Fino ad ora, <mvc:annotation-driven /> ha causato molti problemi per me, quindi mi piacerebbe sbarazzarmene. Sebbene sia spring framework docs clearly say what it is supposed to be doing, manca un elenco di tag effettivamente sommario <mvc:annotation-driven />.Come sbarazzarsi di <mvc: annotation-driven />?

Così mi sono bloccato con la rimozione <mvc:annotation-driven /> e ora ottenere l'errore

WARN osweb.servlet.PageNotFound - alcun mapping trovato per la richiesta HTTP con URI [/ webapp/tirocinanti] in DispatcherServlet con il nome 'workoutsensor'

per tutti gli URL che si suppone essere risolto dalle classi controller (in questo caso: ./trainees). Qualche suggerimento su dove posso leggere di più su <mvc:annotation-driven />? Desidero disperatamente sapere quali tag sono rappresentati esattamente da <mvc:annotation-driven />.

risposta

26

È possibile utilizzare BeanPostProcessor per personalizzare ciascun bean definito da <mvc:annotation-driven />. I javadoc ora descrivono tutti i bean dei registri dei tag.

Se davvero si vuole sbarazzarsi di esso, si può guardare il codice sorgente di org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser

E si può vedere che i fagioli si sta definendo. Ho fatto questo 'esercizio' (non per tutti, ma per quelli che ho bisogno), ecco che sono:

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

Ora, sopra si vede il CommonWebBindingInitializer. Devi creare questa classe, per utilizzare la conversione e la convalida:

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

} 

E questo funziona bene per me finora. Sentiti libero di segnalare eventuali problemi con esso.

+0

Grazie Bozho, questo è solo l'input di cui ho bisogno. Sono abbastanza sicuro che mi imbatterò in ulteriori problemi di configurazione, in particolare, implementando . Non esiterò a segnalarli ;-) –

+1

Ah, c'è il collegamento Fisheye che stavo cercando. :] – earldouglas

+1

L'origine BTW 'AnnotationDrivenBeanDefinitionParser' può essere visualizzata anche su GitHub: https://github.com/cbeams/spring-framework/blob/master/org.springframework.web.servlet/src/main/java/org/springframework /web/servlet/config/AnnotationDrivenBeanDefinitionParser.java –

5

Se si vuole evitare il tag mvc:annotation-driven, si può semplicemente creare DefaultAnnotationHandlerMapping e AnnotationMethodHandlerAdapter fagioli te stesso, ma suona come sarebbe meglio per arrivare alla radice dei vostri problemi con il tag stesso.

Quali sono i sintomi del tuo problema? Cosa stai cercando di fare con la tua applicazione Spring MVC?

Se si desidera sapere cosa sta succedendo sotto le copertine quando si utilizza mvc: annotation-driven, vedere il metodo AnnotationDrivenBeanDefinitionParser.parse().

+1

"Quali sono i sintomi del tuo problema?" - O, è solo che ogni volta che personalizzo un'interfaccia di sicurezza a molla (ad esempio UserDetailsManager) ottengo un errore "doppio definito".O quando provo a definire i miei aspetti, i miei non vengono mai letti perché la primavera usa il suo. Inoltre, mi sento meglio avere un maggiore controllo su ciò che codice. La convention-over-configuration è una grande cosa ... se sai cos'è la convenzione ;-) –

3

Vecchia domanda Lo so, ma questo può aiutare qualcuno. Grazie ai post su questa pagina e anche a over here, ho utilizzato quanto segue per sostituire il tag guidato dall'annotazione nell'app Roo 1.2. Il kicker per me aveva bisogno della conversione del tipo di supporto nella visualizzazione elenco delle app 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 ha introdotto [nuove classi di supporto] (http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/mvc.html# mvc-ann-requestmapping-31-vs-30) per @RequestMapping che dovrebbe essere utilizzato "per sfruttare le nuove funzionalità di Spring MVC 3.1". Ho aggiornato questo esempio. – sbk

2

Mentre si esegue l'override, sii prudente considerare anche l'esecuzione prioritaria della gestione Esecuzione personalizzata. In caso contrario, tutti i mapping delle eccezioni personalizzati avranno esito negativo. Dovrai riutilizzare messageCoverters con un bean di elenco:

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