Как использовать несколько ViewResolvers в Spring?

Регистрация объекта HttpConfiguration как экземпляра в UnityContainer также поможет решить проблему.
Просто нужно добавить, чтобы добавить строку ниже при регистрации в UnityContainer.

public static void RegisterTypes(IUnityContainer container) {
    container.RegisterInstance<HttpConfiguration>(GlobalConfiguration.Configuration);
}

Это поможет Unity разрешить параметр config, когда он вызывает конструктор с параметром.

public HelpController(HttpConfiguration config) {
    Configuration = config;
}
17
задан skaffman 22 June 2009 в 20:26
поделиться

2 ответа

Как вы говорите, вы не можете связать их вместе. В javadoc для обоих четко указано, что они оба должны находиться в конце цепочки преобразователя.

Я предлагаю, чтобы, если вам действительно нужно использовать их вместе, вы написали простую пользовательскую реализацию ViewResolver, которая принимает имя представления, и решает, какой из двух «реальных» преобразователей представлений делегировать. Это предполагает, что вы можете сказать, какой преобразователь вызывать, на основе имени представления.


Итак, вы должны определить собственный ViewResolver следующим образом:

public class MyViewResolver implements ViewResolver {

    private ViewResolver tilesResolver;
    private ViewResolver jspResolver;

    public void setJspResolver(ViewResolver jspResolver) {
        this.jspResolver = jspResolver;
    }

    public void setTilesResolver(ViewResolver tilesResolver) {
        this.tilesResolver = tilesResolver;
    }

    public View resolveViewName(String viewName, Locale locale) throws Exception {
        if (isTilesView(viewName)) {
            return tilesResolver.resolveViewName(viewName, locale);
        } else {
            return jspResolver.resolveViewName(viewName, locale);
        }
    }

    private boolean isTilesView(String viewName) {
    .....
    }
}

Вам нужно будет реализовать метод isTilesView, чтобы решить, какой преобразователь делегировать.

В конфигурации XML определите этот новый преобразователь представлений и сделайте убедитесь, что он появляется перед другими.

<bean class="MyViewResolver">
    <property name="tilesResolver" ref="tilesViewResolver"/>
    <property name="jspResolver" ref="viewResolver"/>
</bean>
20
ответ дан 30 November 2019 в 13:21
поделиться

Похоже, вы на правильном пути, но нужно иметь в виду, что некоторые преобразователи представлений ведут себя так, как будто они всегда разрешали представление. Вы должны указывать такие резолверы последними в вашем заказе. Я считаю, что представление Tiles является одним из таких.

Edit: упс ... да, другой плакат правильный, оба этих преобразователя будут «всегда соответствовать», поэтому вы не можете использовать их оба в цепочке. Другой альтернативой может быть попытка расширить TilesView для выполнения простого рендеринга JSP, если он не может найти настроенное представление плитки.

1
ответ дан 30 November 2019 в 13:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: