web-dev-qa-db-ja.com

複数のビューリゾルバーを備えたSpringMVC

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="0" />
    </bean>
</beans>
_

アプリケーションは常に、順序が最も低いもののみを使用し、他は使用しません。現在の場合、コントローラーが「someView」を返すと、「pages/someView.xhtml」があっても、アプリはThe requested resource (/MyProject/WEB-INF/views/someView.jsp) is not available.で応答します。

Springバージョン-3.2.3

編集:コントローラーに2つのメソッドがあり、methodAが「viewA」を返し、methodBが「viewB」を返す場合。そして、「views」フォルダにviewA.jspがあり、「pages」にviewB.xhtmlがあります。

ケース1:UrlBasedViewResolver-> order = 1、InternalResourceViewResolver-> order = 2

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

_methodB -> OK
_

ケース2:UrlBasedViewResolver-> order = 2、InternalResourceViewResolver-> order = 1

methodA-> OK;

_methodB -> `The requested resource (/MyProject/WEB-INF/views/viewB.jsp) is not available.`;
_
6
Evgeni Dimitrov

注文の優先順位を誤解されたと思います。最上位のViewResolverは、チェーンの最後のリゾルバーです。 InternalResourceViewResolver0の順序を指定したため、これがチェーンの最初のリゾルバーになり、InternalResourceViewResolverは返されるビュー名に関係なくビューを解決します。したがって、複数のリゾルバーが必要な場合は、InternalResourceViewResolverが最上位のリゾルバーである必要があります。

InternalResourceViewResolver注文値を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>

編集:

Javadocを確認したところ、InternalResourceViewResolverUrlBasedViewResolver(InternalResourceViewResolverはUrlBasedViewResolverを拡張している)であるため、これら2つのリゾルバーをチェーンできないようです。両方のリゾルバは常に戻り値と一致します。これを行うには、何かカスタムが必要になると思います。

11

InternalResourceViewResolverの順序を0から1に変更します。InternalResourceViewResolverの順序は最大(優先度が低い)である必要があります。

1
yname