2013-08-13 13 views
6

Próbuję użyć 2 Widok resolwera:wiosny MVC z wielu widoków przeliczniki

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

Aplikacja zawsze używa tylko jednego z najniższego rzędu, a nie inny. W tym przypadku, jeśli mój kontroler zwróci "someView", aplikacja odpowie z numerem The requested resource (/MyProject/WEB-INF/views/someView.jsp) is not available., nawet jeśli istnieje "pages/someView.xhtml".

Wiosna wersja - 3.2.3

Edit: Jeśli mam 2 metody w kontrolerze i metodaA powraca "viewA" i metodaB zwraca "viewB". I mamy viewA.jsp w folderze "widoki" i viewB.xhtml na "stronach".

Przypadek 1: UrlBasedViewResolver -> celu = 1, InternalResourceViewResolver -> celu = 2

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

methodB -> OK 

Przypadek 2: UrlBasedViewResolver -> celu = 2, InternalResourceViewResolver -> celu = 1

metodaA -> ok;

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

Odpowiedz

11

Chyba źle priorytet zamówienia. Model ViewResolver o najwyższym porządku jest ostatnim resolver w łańcuchu. Ponieważ podałeś InternalResourceViewResolver zlecenie 0, będzie to pierwszy resolver w łańcuchu, a InternalResourceViewResolver rozwiąże widok niezależnie od zwracanej nazwy widoku. Tak więc, jeśli potrzebujesz wielu przeliczników, InternalResourceViewResolver musi być tłumaczem o najwyższym porządku.

Zmień wartość InternalResourceViewResolver celu 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:

Po sprawdzeniu javadoc, wydaje się, że te dwa przeliczniki nie może być przykuty od InternalResourceViewResolver jest UrlBasedViewResolver (InternalResourceViewResolver rozciąga UrlBasedViewResolver). Obydwa przeliczniki zawsze pasują do zwróconej wartości. Myślę, że będziesz potrzebował czegoś niestandardowego, aby móc to zrobić.

+0

Zaktualizowałem moje pytanie, mam nadzieję, że teraz będzie bardziej przejrzyste. –

+0

Sprawdź moją edycję. Jaki jest twój przypadek użycia. Dlaczego używasz tych dwóch UrlBasedViewResolver. –

1

zamówienie chage w InternalResourceViewResolver od 0 do 1. InternalResourceViewResolver musi mieć największe zamówienie (niższy priorytet)

+0

Jak wyjaśniłem, dostępny jest tylko program rozpoznawania widoku z niższym rzędem. Jeśli to zrobię, aplikacja zawsze będzie szukała widoku na "stronach" z sufiksem = xhtml i wyświetli błąd, jeśli nie zostanie tam znaleziony ... –