是否可以使用不同的视图解析器?

2022-08-31 22:34:20

我在Spring配置中有多个视图解析器,并希望对不同的请求使用不同的视图解析器。

示例:对于以 开头的 URL,请使用 Birt 视图解析器,对于 ajax 调用,请使用磁贴解析器等。report_*

已尝试设置 order 属性,但所有视图都由 解决。tilesViewResolver

<beans:bean id="tilesViewResolver" class="org.springframework.js.ajax.AjaxUrlBasedViewResolver">
    <beans:property name="viewClass" value="com.example.example.util.AjaxTiles21View"/>
</beans:bean>

<beans:bean id="birtViewResolver" class="org.eclipse.birt.spring.core.BirtViewResolver">
    ...
    <beans:property name="order" value="2" />
</beans:bean>

<beans:bean id="beanNameResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver">
    <beans:property name="order" value="1" />
</beans:bean>

答案 1

你绝对可以。 具有单个方法,resolveViewName(String),它返回ViewResolver

View 对象,如果未找到,则为 null(可选,以允许 ViewResolver 链接)

您的豆子已注册。当处理程序返回视图名称时,Spring将循环访问每个视图名称,并使用给定名称调用它们的方法。如果该方法返回 non,则使用该方法。如果 返回,则继续迭代。ViewResolverViewResolverresolveViewName-nullViewnull

因此,如果Spring要跳过它,则必须返回实现。null

有些实现永远不会返回 。您的自定义类似乎就是这种情况。如果 返回 a ,即使最终无法呈现,Spring 也会使用它。nullViewResolverViewResolverViewView

您要么需要修复它,要么订购豆子。例如,您可以使用界面订购它们。让类实现该接口并返回适当的值。ViewResolverOrdered


答案 2

推荐