2010-10-30 5 views
45

einfachstes Beispiel zu stoppen:Mit <mvc: Ressourcen ... /> im Frühjahr 3 Ursachen alle anderen Ansichten arbeiten

Ich habe ein Dispatcher Servlet alles fangen konfiguriert:

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

ich habe einfacher Test-Controller:

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

In diesem Testfall addiere ich (oder zu entfernen) die folgende Zeile dispatcher-servlet.xml:

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

Mein hohes Ziel: statische Inhalte zu dienen (Bilder, CSS, JS) zusammen mit meinem dynamischen Inhalten (erzeugt über Geschwindigkeit innerhalb eines Jetty Servlet-Container, mit dem allmächtigen Frühling zusammen gebunden).

Mein Dilema: Als ich <mvc:resources .../> hinzufügen bekomme ich eine 404 für http://localhost/index, aber ich kann ein Bild von http://localhost/public/img/42.png dienen. Wenn ich <mvc:resources .../> entferne, dann funktioniert http://localhost/index funktioniert gut, aber natürlich, wie kann ich statischen Inhalt dienen?

Bonusfrage: Warum kann ich nie meinen Kuchen essen und es auch essen?

Antwort

64

Es gibt zwei Probleme:

  1. Nie /* in Servletzuordnung verwenden:

    <servlet-mapping> 
        <servlet-name>dispatcher</servlet-name> 
        <url-pattern>/</url-pattern> 
    </servlet-mapping> 
    
  2. <mvc:resources> erfordert <mvc:annotation-driven> (oder explizit deklariert Handler Mappings, etc.).

    Dies passiert, weil DispatcherServlet die Standardkonfiguration von Handlerzuordnungen nur anwendet, wenn keine benutzerdefinierten Handlerzuordnungen im Kontext gefunden werden. Da <mvc:resources> ein eigenes Handler-Mapping hinzufügt, sind die Standardwerte fehlerhaft, daher sollten andere Handler-Zuordnungen explizit deklariert werden, entweder durch <mvc:annotation-driven> oder manuell als Beans.

    Beachten Sie auch, dass <mvc:resources> nur DefaultAnnotationHandlerMapping erklärt und auch keine Aussage andere Zuordnungen wie BeanNameUrlHandlerMapping, obwohl sie in Verzug von DispatcherServlet sind. Deklarieren Sie sie manuell, wenn Sie sie benötigen.

+1

Vielen Dank! Frage obwohl (ich bin neu mit Frühling), hatte ich (in einem Versuch, den Dokumenten zu folgen) hinzugefügt um die Controller zu scannen, tut mvc: Annotation-Driven ersetzen das? Ich bin ein wenig verschwommen zwischen der "einfachen neuen Art, Dinge zu tun" vs. "Dinge auf die alte Art zu tun", scheint, dass es im Frühling drei Möglichkeiten gibt, alles zu tun und manchmal denke ich, dass ich sie mische. –

+0

@David: '' ersetzt nicht ', es konfiguriert nur neue Funktionen von Spring MVC (vielleicht ist es schlecht benannt). – axtavt

+0

Danke, ich habe getan, was du gesagt hast und die Magie ist passiert, ich habe jetzt eine wirklich ehrliche Webapp. :) –

0

Ich traf auch dieses Problem vor. Meine Situation war Ich habe nicht alle 62 Spring Framework Gläser in die Lib-Datei (Spring-Framework-4.1.2.RELEASE Edition) gesetzt, es hat funktioniert. Und dann habe ich auch die 3.0.xsd in 2.5 oder 3.1 für Test geändert, es hat alles geklappt. Natürlich beeinflussen auch andere Faktoren Ihr Ergebnis.

Verwandte Themen