具有多个视图解析器的Spring MVC

Evg*_*rov 6 spring facelets spring-mvc

我尝试使用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>
Run Code Online (Sandbox Code Playgroud)

应用程序始终只使用最低顺序而不是另一个.在目前的情况下,如果我的控制器返回"someView",The requested resource (/MyProject/WEB-INF/views/someView.jsp) is not available.即使有"pages/someView.xhtml" ,应用程序也会响应.

春季版 - 3.2.3

编辑:如果我在控制器中有2个方法,方法A返回"viewA",方法B返回"viewB".我们在'views'文件夹中有viewA.jsp,在'pages'中有viewB.xhtml.

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

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

methodB -> OK
Run Code Online (Sandbox Code Playgroud)

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

methodA - > OK;

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

Jea*_*ond 11

我认为你误解了订单的优先顺序.该ViewResolver最高顺序是链中最后一个解析器.由于您给出了InternalResourceViewResolver一个订单0,它将成为链中的第一个解析器,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>
Run Code Online (Sandbox Code Playgroud)

编辑:

检查javadoc后,似乎这两个解析器无法链接,因为它InternalResourceViewResolver是一个UrlBasedViewResolver(InternalResourceViewResolver扩展UrlBasedViewResolver).两个解析器始终匹配返回的值.我想你需要一些自定义才能做到这一点.