tangobee tangobee - 1 year ago 77
Java Question

Spring: is it possible to use different view resolvers?

I have multiple view resolvers in my Spring configuration and I wanted to use different view resolvers for different requests

Example for urls started with

use Birt view resolver and for ajax calls use Tiles resolver and so on.

I tried setting order property but all views are resolved by tilesViewResolver

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

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

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

Answer Source

You absolutely can. ViewResolver has a single method, resolveViewName(String) which returns

the View object, or null if not found (optional, to allow for ViewResolver chaining)

Your ViewResolver beans are registered. When a view name is returned by a handler, Spring will iterate through each ViewResolver, invoking their resolveViewName method with the given name. If the method returns non-null, that View is used. If null is returned, then it continues iterating.

So the implementation has to return null if Spring is to skip it.

There are some implementations that never return null. This seems to be the case with your custom ViewResolver classes. If the ViewResolver returns a View, even if that View will eventually fail to be rendered, Spring will use it.

You either need to fix that or order your ViewResolver beans. For example, you can order them with the Ordered interface. Have your classes implement that interface and return an appropriate value.