【问题标题】:Is it possible to use different view resolvers?是否可以使用不同的视图解析器?
【发布时间】:2014-08-02 04:53:06
【问题描述】:

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

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

尝试设置 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>

【问题讨论】:

    标签: java spring-mvc birt


    【解决方案1】:

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

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

    您的ViewResolver bean 已注册。当处理程序返回视图名称时,Spring 将遍历每个ViewResolver,并使用给定名称调用它们的resolveViewName 方法。如果方法返回非-null,则使用View。如果返回null,则继续迭代。

    所以如果 Spring 要跳过它,实现必须返回 null

    有些实现永远不会返回null。您的自定义 ViewResolver 类似乎就是这种情况。如果ViewResolver返回一个View,即使那个View最终会渲染失败,Spring也会使用它。

    您要么需要解决这个问题,要么订购您的ViewResolver bean。例如,您可以使用Ordered 接口订购它们。让您的类实现该接口并返回适当的值。

    【讨论】:

    • 您是如何在控制器中调用它的(假设您使用的是控制器)?
    • 这是我的控制器@RequestMapping(value = {"/report_emp"}) public String reportTest(Model model) {return null;}
    • @tangobee 仅供参考:如果删除空格,@name 会更可靠地工作,例如@SotiriosDelimanolis。在这种情况下,这并不重要,因为如果您要回复留下答案的人,则不需要 @name。在大多数情况下,该软件会尝试根据谁响应来猜测您的意思,因为它会忽略“Delimanolis”部分,因为它位于空格之后。至少,我是这么理解的。
    • @trl 名字前三个字母就够了。
    • @mhm 如果它们是明确的。老实说,我只是输入@,开始绑定,当我只看到一个名字时,我按 Tab。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    相关资源
    最近更新 更多