2013-08-13 18 views
6

ho cercato di utilizzare 2 visualizza resolver:Spring MVC con vista multipli resolver

<?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> 

l'applicazione utilizza sempre solo quella con l'ordine più basso e non l'altro. Nel caso corrente se il mio controller restituisce "SomeView", l'app risponderà con The requested resource (/MyProject/WEB-INF/views/someView.jsp) is not available. anche se è presente "pages/someView.xhtml".

versione Spring - 3.2.3

Edit: Se ho 2 metodi di controllo e Methoda restituisce "viewA" e MethodB restituisce "viewB". E abbiamo viewA.jsp nella cartella 'views' e viewB.xhtml in 'pages'.

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

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

methodB -> OK 

Case2: UrlBasedViewResolver -> ordine = 2, InternalResourceViewResolver -> ordine = 1

Methoda -> OK;

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

risposta

11

Penso che tu frainteso la priorità ordine. Lo ViewResolver con l'ordine più alto è l'ultimo risolutore della catena. Dato che hai dato il un ordine di 0, sarà il primo risolutore della catena e lo risolverà la visualizzazione a cui viene restituito il nome della vista. Quindi, se vuoi più risolutori, lo deve essere il resolver con l'ordine più alto.

Modificare il valore InternalResourceViewResolver per 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:

Dopo aver verificato la javadoc, sembra che questi due resolver non possono essere concatenati in quanto il InternalResourceViewResolver è una UrlBasedViewResolver (InternalResourceViewResolver estende UrlBasedViewResolver). Entrambi i resolver corrispondono sempre al valore restituito. Penso che avrai bisogno di qualcosa di personalizzato per essere in grado di farlo.

+0

Ho aggiornato la mia domanda, spero che ora sia più chiara. –

+0

Controlla la mia modifica. Qual è il tuo caso d'uso. Perché stai usando quei due UrlBasedViewResolver. –

1

ordine Chage in InternalResourceViewResolver da 0 a 1. InternalResourceViewResolver deve avere più grande ordine (priorità più bassa)

+0

Come ho spiegato solo il resolver di visualizzazione con l'ordine inferiore è disponibile. Se lo faccio, l'app cercherà sempre la vista in "pagine" con suffisso = xhtml e genererà un errore se non si trova uno lì ... –