2012-02-08 4 views
1

Я ищу способ создания сложных сопоставлений URL-адресов, которые будут зависеть от содержимого базы данных. Например, я показать два URL отображения:Spring MVC: расширенное отображение на основе аннотации

/{category}/ 
    /{category}/{slug}/{id} 

Категории могут быть, например:

apples, pears, lemons -> resolve to FruitListController, 
    beans, onions, potatoes -> resolve to VegetableListController. 
  • Обратите внимание, что эти категории сохраняются в базе данных и могут быть изменены.

Если у меня есть еще и slug и id, то оба они должны быть проверены на базе базы данных, если они существуют.

Могу ли я каким-то образом написать «Обработчик категории», который вернет соответствующую категорию и связанный с ней контроллер?

Очевидно, это проблема перевода URL -> Request. Кроме того, есть ли способ генерировать обратное Запрос -> URL аналогичным образом? Я хотел бы что-то вроде шаблонов:

<c:foreach="apples as apple" 
     <a href="${link AppleController:defaultView, ID = apple.id}">${apple.name}</a> 
    </c:foreach> 

ответ

2

Использование WebArgumentResolvers. Они имеют доступ к WebRequest, чтобы увидеть ваш URL. Решители могут выполнять поиск в базе данных. FruitWebArgumentResolver может вернуть Fruit или вернуть UNRESOLVED. VegetableArgumentResolver может возвращать Овощ или возвращать НЕРАЗРЕШЕННЫЙ. После того, как аргумент будет разрешен, адаптер обработчика может сопоставляться с RequestMapping, который принимает конкретный тип в качестве аргумента. Например,

@RequestMapping("/{catagory}/{slug}") 
public void fruitSlugList(Fruit fruit, @PathVariable("slug") String slug){ 

Чтобы увидеть пример этого, у меня есть сообщение в блоге здесь, который использует тот же тип механизма: http://www.adamweigold.com/2012/01/using-multpartrequestresolvers-with.html

+0

Спасибо за решение, хотя я не уверен, как блог сообщение связано с моей проблемой. Возможно ли таким образом определить необязательные аргументы? Я также думаю о создании URL-адреса для данного элемента управления: view - предоставляет ли он некоторые инструменты для их создания? –

+0

Я не уверен, что вы имеете в виду о «генерации URL». Что касается дополнительных аргументов, если они являются RequestParams, они могут быть необязательными. Сообщение в блоге показывает только пример используемого ArgumentResolver. Если решение хорошее, пожалуйста, примите ответ (галочка). – aweigold

Смежные вопросы