46 votes

En utilisant <mvc:resources .../> au printemps 3, toutes les autres vues cessent de fonctionner

Exemple le plus simple:

J'ai un répartiteur de servlet configuré pour attraper tout:

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

J'ai un simple contrôleur de test:

@RequestMapping("/index")
@ResponseBody
public String rootTest(){
    return "Main page displayed from TestController";
}

Dans ce cas de test, je suis d'ajouter (ou supprimer) la ligne suivante à l' dispatcher-servlet.xml:

<mvc:resources mapping="/public/**" location="/public/"/>

Mon objectif ambitieux: pour servir du contenu statique (images, css, js) avec mon contenu dynamique (produits par l'intermédiaire de Vitesse à l'intérieur d'une Jetée conteneur de servlet, attachés ensemble avec le tout-puissant de Printemps).

Mon Dilemme: Quand j'ajoute de la <mvc:resources .../> j'obtiens une erreur 404 pour http://localhost/index, mais je peux servir d'une image à partir http://localhost/public/img/42.png. Si je supprime <mvc:resources .../> alors http://localhost/index fonctionne très bien, mais bien sûr, comment puis-je servir du contenu statique?

Question Bonus: Pourquoi ne puis-je jamais avoir mon gâteau et le manger aussi?

65voto

axtavt Points 126632

Il y a 2 problèmes:

  1. N'utilisez jamais d' /* dans le servlet de cartographie:

    <servlet-mapping> 
        <servlet-name>dispatcher</servlet-name> 
        <url-pattern>/</url-pattern> 
    </servlet-mapping> 
    
  2. <mvc:resources> exige <mvc:annotation-driven> (ou explicitement déclaré mappages de gestionnaires, etc).

    Cela se produit parce que l' DispatcherServlet s'applique par défaut de la configuration des mappages de gestionnaires uniquement si aucun gestionnaire personnalisé mappages trouvé dans le contexte. Depuis <mvc:resources> ajoute son propre mappage de gestionnaire, les valeurs par défaut sont brisés, par conséquent, d'autres mappages de gestionnaires devraient être decalred explicitement, soit en <mvc:annotation-driven> ou manuellement comme des haricots.

    Notez aussi que l' <mvc:resources> déclare seulement DefaultAnnotationHandlerMapping et de ne pas déclarer d'autres mappages comme BeanNameUrlHandlerMapping, s'ils sont dans les valeurs par défaut de DispatcherServlet. Déclarer manuellement si vous en avez besoin.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X