Comment enregistrer les intercepteurs handler avec spring mvc 3.0?

Il devrait être facile:

<bean id="handlerMapping"
   class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="interceptors">
        <list>
            <ref bean="myInterceptor" />
        </list>
    </property>
</bean>

mais de cette façon, l'intercepteur n'est pas appelé.

18
demandé sur Bozho 2010-07-12 21:23:54

5 réponses

par défaut, le ressort enregistrera un BeanNameUrlHandlerMapping et DefaultAnnotationHandlerMapping, sans aucune configuration explicite requise.

si vous définissez votre propre HandlerMapping les haricots, puis ceux par défaut ne seront pas enregistrées, et il vous suffit de faire explicitement déclaré.

jusqu'ici, tout va bien.

Le problème vient quand vous ajoutez <mvc:annotation-driven/> pour le mélange. Ce déclare ses propres DefaultAnnotationHandlerMapping, qui remplace les valeurs par défaut. Cependant, si vous déclarez aussi votre propre, alors vous vous retrouvez avec deux. Comme ils sont consultés dans l'ordre de la déclaration, il s'agit généralement de celui enregistré par <mvc:annotation-driven/> est appelé en premier, et votre propre est ignorée.

Il serait mieux si l' DefaultAnnotationHandlerMapping enregistré par <mvc:annotation-driven/> agit comme celui par défaut, c'est-à-dire si ceux explicitement déclarés ont la priorité, mais ce n'est pas la façon dont ils l'ont écrit.

Ma préférence est de ne pas utiliser <mvc:annotation-driven/> tout, c'est trop compliqué, et trop imprévisible lorsqu'il est mélangé avec d'autres les options de configuration. Il ne fait pas vraiment quelque chose de particulièrement complexe, il n'est pas difficile ou verbeux d'ajouter explicitement les choses qu'il fait pour vous, et le résultat final est plus facile à suivre.

29
répondu skaffman 2010-07-12 18:57:36

Problème, j'ai affronté: printemps étiquette MVC ne va pas bien avec la définition personnalisée de DefaultAnnotationHandlerMapping.

Pourquoi..? la raison est très bien expliquée dans les réponses ci-dessus.

pourquoi je voulais utiliser DefaultAnnotationHandlerMapping? Je veux définir un intercepteur pour chaque requête. un intercepteur mobile pour déterminer L'AGENT utilisateur..mobile ou navigateur?

maintenant à cause de ce choc de MVC-annotation et DefaultAnnotationHandlerMapping, Je ne peux plus utiliser DefaultAnnotationHandlerMapping. Le problème vient de la façon dont je peux enregistrer mes intercepteurs avec tag.

la solution était simple...mais difficile à trouver. En le postant pour qu'il puisse être utile aux autres chercheurs de solutions.. Utilisez l'étiquette et enregistrez le haricot intercepteur dans votre dispathcer-servlet.XML exemple:

<mvc:interceptors>
 <!-- This runs for all mappings -->
     <bean  class="main.com.XXX.MobileDeviceResolverHanlderInterceptor"/>
</mvc:interceptors>
13
répondu Swapnil Vargaonkar 2012-05-25 05:11:36

La raison de ce comportement est que deux grains de type org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping existent dans le contexte de l'application. Le printemps résout les deux, mais demande seulement le premier pour les intercepteurs. Pour corriger cela, le paramètre init suivant doit être défini à DispatcherServlet

<init-param>
    <param-name>detectAllHandlerMappings</param-name>
    <param-value>false</param-value>
</init-param>

ceci fait que le servlet du répartiteur n'utilise que le handlerMapping défini dans le x-servlet.xml

Je ne comprends pas pourquoi c'est le comportement par défaut. J'attends une réponse de la communauté spring.

9
répondu Bozho 2010-07-12 17:34:40

dans mon cas je ne peux pas me débarrasser de <mvc:annotation-driven/> comme j'utilise jackson pour le support json en utilisant l'annotation.

Ce que j'ai essayé, s'est rapproché de moi tous les intercepteurs <mvc:interceptors> dans un fichier "xml" séparé (interceptor-config.xml) et importé de mon x-répartiteur-servlet.xml

<import resource="interceptor-config.xml"/>

il résout mon problème et évite 'DefaultAnnotationHandlerMapping' par défaut mon contexte d'application.

plutôt que de créer un ' xml ' séparé, vous pouvez copier / coller des contenus intercepteurs directement dans 'x-répartiteur-servlet.xml".

Voici mon intercepteur:

  <mvc:interceptors> 
         <mvc:interceptor>
             <!-- Intercepting specific URL -->
             <mvc:mapping path="/abc/**" />
             <bean id= "myInterceptor" 
                 class="xx.xxx.xxx.MyInterceptor" />
         </mvc:interceptor>
<mvc:interceptors>
6
répondu arviarya 2012-11-08 00:28:28

au printemps MVC 3.0 vous pouvez utiliser <mvc:interceptors> au lieu de définir manuellement le mappage du gestionnaire.

3
répondu axtavt 2010-07-12 17:57:02