2012-08-17 2 views
2

SpringMVC est livré avec un espace de noms « mvc » géré par (sans surprise) « MvcNamespaceHandler », défini comme ceci:Est-il possible de remplacer un gestionnaire Spring Namespace?

public class MvcNamespaceHandler extends NamespaceHandlerSupport { 

public void init() { 
    registerBeanDefinitionParser("annotation-driven", new AnnotationDrivenBeanDefinitionParser()); 
    registerBeanDefinitionParser("default-servlet-handler", new DefaultServletHandlerBeanDefinitionParser()); 
    registerBeanDefinitionParser("interceptors", new InterceptorsBeanDefinitionParser());  
    registerBeanDefinitionParser("resources", new ResourcesBeanDefinitionParser()); 
    registerBeanDefinitionParser("view-controller", new ViewControllerBeanDefinitionParser()); 
} 

}

Je voudrais modifier le comportement de l'espace de noms afin que mvc: ressources L'élément est géré par un CustomBeanDefinitionParser personnalisé (dans mon cas, pour remplacer un ResourcesHttpRequestHandler, créé par l'analyseur de définition du bean, avec une implémentation personnalisée).

Je voudrais savoir s'il est possible de le faire sans passer par les tracas de la création d'un nouvel espace de noms (comme décrit ici http://static.springsource.org/spring/docs/2.0.x/reference/extensible-xml.html).

Merci!

Répondre

1

Vous pouvez créer un espace de nom personnalisé pour enregistrer un ResourceHttpRequestHandler différent, mais comme vous l'avez dit, il s'agit certainement d'une bonne quantité de travail.

Une meilleure approche pourrait être de définir simplement le haricot explicitement dans la configuration de cette façon, le ResourcesBeanDefinition fait essentiellement ceci:

<bean name="resourceHandler" class="org.springframework.web.servlet.resource.ResourceHttpRequestHandler"> 
    <property name="locations"> 
     <list> 
      <value>/resources/</value> 
    </property> 
</bean> 

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
    <property name="urlMap"> 
     <map> 
      <entry key="/resources/**" value-ref="resourceHandler"/> 
     </map> 
    </property> 
</bean> 

Vous pouvez simplement remplacer le resourceHandler avec votre mise en œuvre ici.

0

J'ai eu ce même problème aujourd'hui (mais pour le contexte namespaceHandler). Je l'ai fait d'une manière hacky.

Créez un fichier nommé spring.handlers dans votre dossier META-INF et placez une déclaration remplaçant le schéma par défaut. Dans votre cas, quelque chose comme ceci:

http\://www.springframework.org/schema/mvc=org.springframework.web.servlet.config.MvcNamespaceHandler 

pour

http\://www.springframework.org/schema/mvc=YOURBEANPATH. 

Peut-être que vous devez déclarer le fichier spring.handlers dans un bocal avec un nom qui commence par une lettre supérieure à l « » (en mon cas c'était 't'), comme le printemps va fusionner les définitions spring.handlers par l'ordre dans lequel ils se trouvent. Pour des informations de débogage, consultez DefaultNamespaceHandlerResolver#getHandlerMappings.

+0

Les fichiers JAR ne sont pas nécessairement chargés dans l'ordre alphabétique des noms. Cela peut fonctionner pour vous à cette occasion, mais tout pourrait mal tourner si vous ajoutez une autre bibliothèque, déplacez les fichiers JAR vers un nouveau système de fichiers, ... – Kkkev

+0

Bon conseil. Je vais essayer de résoudre cela de manière plus résiliente. – user1607938

Questions connexes