2013-08-13 8 views
6

Ich habe versucht 2 Ansicht Resolvern zu verwenden:Spring MVC mit mehreren Ansichten Resolvern

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans  
     http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context.xsd 
     http://www.springframework.org/schema/mvc 
     http://www.springframework.org/schema/mvc/spring-mvc.xsd"> 

    <context:component-scan base-package="com.evgeni.dfr.controller" /> 

    <context:annotation-config /> 
    <mvc:annotation-driven /> 

    <bean id="viewResolver" 
     class="org.springframework.web.servlet.view.UrlBasedViewResolver"> 
     <property name="cache" value="false" /> 
     <property name="viewClass" value="com.evgeni.drf.faces.FacesView" /> 
     <property name="prefix" value="/WEB-INF/pages/" /> 
     <property name="suffix" value=".xhtml" /> 

     <property name="order" value="1" /> 
    </bean> 

    <bean 
     class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix"> 
      <value>/WEB-INF/views/</value> 
     </property> 
     <property name="suffix"> 
      <value>.jsp</value> 
     </property> 
     <property name="order" value="0" /> 
    </bean> 
</beans> 

Die Anwendung nutzt immer nur die mit der niedrigsten Ordnung und das andere nicht. Im aktuellen Fall, wenn mein Controller "someView" zurückgibt, wird die App mit The requested resource (/MyProject/WEB-INF/views/someView.jsp) is not available. antworten, auch wenn "pages/someView.xhtml" vorhanden ist.

Frühling Version - 3.2.3

Edit: Wenn ich zwei Methoden in der Steuerung und methodA gibt "ViewA" und methodeB gibt "ViewB". Und wir haben viewA.jsp im Ordner 'views' und viewB.xhtml in 'pages'.

Case1: UrlBasedViewResolver -> order = 1, InternalResourceViewResolver -> 2 order =

methodA ->The requested resource (/MyProject/WEB-INF/pages/viewA.xhtml) is not available.;

methodB -> OK 

Case2: UrlBasedViewResolver -> bestellen = 2, InternalResourceViewResolver -> order = 1

methodA -> OK;

methodB -> `The requested resource (/MyProject/WEB-INF/views/viewB.jsp) is not available.`; 

Antwort

11

Ich glaube, Sie die Reihenfolge Priorität falsch verstanden. Die ViewResolver mit der höchsten Reihenfolge ist der letzte Resolver in der Kette. Da Sie die InternalResourceViewResolver eine Bestellung von 0 gegeben haben, wird es der erste Resolver in der Kette sein und die InternalResourceViewResolver löst die Ansicht, egal welcher Ansichtsname zurückgegeben wird. Wenn Sie also mehrere Resolver benötigen, muss der InternalResourceViewResolver der Resolver mit der höchsten Reihenfolge sein.

Ändern Sie den InternalResourceViewResolver Auftragswert zu 2:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans  
     http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context.xsd 
     http://www.springframework.org/schema/mvc 
     http://www.springframework.org/schema/mvc/spring-mvc.xsd"> 

    <context:component-scan base-package="com.evgeni.dfr.controller" /> 

    <context:annotation-config /> 
    <mvc:annotation-driven /> 

    <bean id="viewResolver" 
     class="org.springframework.web.servlet.view.UrlBasedViewResolver"> 
     <property name="cache" value="false" /> 
     <property name="viewClass" value="com.evgeni.drf.faces.FacesView" /> 
     <property name="prefix" value="/WEB-INF/pages/" /> 
     <property name="suffix" value=".xhtml" /> 
     <property name="order" value="1" /> 
    </bean> 

    <bean 
     class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix"> 
      <value>/WEB-INF/views/</value> 
     </property> 
     <property name="suffix"> 
      <value>.jsp</value> 
     </property> 
     <property name="order" value="2" /> 
    </bean> 
</beans> 

EDIT:

Nach dem javadoc Überprüfung, so scheint es, dass diese beiden Resolvern nicht verkettet werden können, da die InternalResourceViewResolver ein UrlBasedViewResolver ist (InternalResourceViewResolver erstreckt UrlBasedViewResolver). Beide Resolver stimmen immer mit dem zurückgegebenen Wert überein. Ich denke, du wirst etwas Brauchbares brauchen, um das zu können.

+0

Ich habe meine Frage aktualisiert, hoffe, dass es jetzt klarer ist. –

+0

Überprüfen Sie meine Bearbeitung. Was ist dein Anwendungsfall? Warum verwenden Sie diese beiden UrlBasedViewResolver? –

1

Chage um in InternalResourceViewResolver von 0 bis 1 InternalResourceViewResolver muss größten Auftrag hat (niedrigere Priorität)

+0

Wie ich erklärt habe, ist nur der View Resolver mit der niedrigeren Ordnung verfügbar. Wenn ich das tue, wird die App immer nach Ansicht in 'Seiten' mit Suffix = XHTML suchen und einen Fehler werfen, wenn man dort nicht gefunden wird ... –