Spring-Mobile предпочтение сайта в viewresolver не на каждом контроллере

Весенняя мобильная документация показывает, как реализовать отдельный слой мобильного представления, как показано ниже:

@Controller
public class HomeController {

    @RequestMapping("/")
    public String home(SitePreference sitePreference, Model model) {
        if (sitePreference == SitePreference.MOBILE) {
            // prepare mobile view for rendering
            return "home-mobile";
        } else {
            // prepare normal view for rendering
            return "home";
        }
    }
}

Однако я бы предпочел применить другое имя представления (с префиксом к папке) в решателе представлений. Как бы я это сделал?

(редактировать: ответов нет, обычно у весенних проблем с конфигурацией есть несколько ответов... я задавал особо глупый вопрос?)

1 ответ

Решение

Ваш вопрос мне кажется действительным. Самый простой ответ, который я могу придумать, - это разделить представления и использовать значение предпочтения сайта в имени папки:

/views/normal/home.jsp
/views/mobile/home.jsp

(Конечно, префикс решателя представления должен быть "/views/").

Теперь в контроллере вы можете иметь:

return sitePreference.name().toLowerCase() + "/home";

Вы не можете использовать два отдельных распознавателя, так как контроллер не может решить, какой просмотрщик использовать, а только какой.

Что касается выбора распознавателя, этим можно управлять только через свойство order, которое полностью выходит за рамки этого варианта использования.


Изменить: я почувствовал запах кода в том, что одинаковая логика дублируется во всех методах контроллера.

Итак, чтобы сохранить эту логику в одном месте, попробуйте использовать HandlerInterceptor который добавил бы префикс к имени представления в postHandle метод. Вам нужно только получить текущий экземпляр SitePreference самостоятельно, основываясь на запросе, что должно быть вполне возможно.

Другие вопросы по тегам