Хорошо, я решил это, расширив InternalResourceViewResolver
.Логика этого проста.Из-за природы InternalResourceViewResolver
мы не можем действительно связать его с другим IRVR, если у нас не будет только одного IRVR, и он не появится в конце цепочки.
Итак, мы должны указать пружине значение return null
при разрешении представлений на основе некоторого условия, которое вызовет запуск следующего IRVR в цепочке.
Для этого все, что я сделалЯ расширил IRVR и использовал предварительно сконфигурированный excludePrefix
, который, если существует в имени представления, мой IRVR исключил бы его и вызвал цепочку.
Вот как выглядит мой ExcludingInternalResourceViewResolver
:
public class ExcludingInternalResourceViewResolver extends
InternalResourceViewResolver {
private String excludePrefix;
@Override
public View resolveViewName(String viewName, Locale locale)
throws Exception {
if (this.excludePrefix != null && viewName.startsWith(this.excludePrefix)) {
return null;
}
return super.resolveViewName(viewName, locale);
}
public void setExcludePrefix(String excludePrefix) {
this.excludePrefix = excludePrefix;
}
}
Ну, в основном у меня настроены два набора преобразователей представлений.Одна из них является обычной для обработки ошибок, страницы успеха, объявление которых выглядит так:
<bean id="commonViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
<property name="order" value="3" />
</bean>
Другой, который находится внутри каждого портлета, выглядит так:
<bean id="viewResolver" class="com.foo.common.spring.web.view.ExcludingInternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/mydetails/" />
<property name="suffix" value=".jsp" />
<property name="order" value="1" />
<property name="excludePrefix" value="common" />
</bean>
Мой обработчик ошибоквыглядит так:
<bean id="defaultExceptionHandler" class="org.springframework.web.portlet.handler.SimpleMappingExceptionResolver">
<property name="order" value="2" />
<property name="defaultErrorView" value="common/error" />
<property name="exceptionMappings">
<props>
<prop key="javax.portlet.PortletException">common/portlet-error</prop>
</props>
</property>
</bean>
И наконец, я переместил свои error.jsp
и portlet-error.jsp
с /WEB-INF/jsp/
на /WEB-INF/jsp/common/
.