Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Один контроллер - один метод 
:(
    Опции темы
RZ_RZ
Дата 18.6.2010, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 7.9.2006

Репутация: нет
Всего: нет



Привет.
Я хочу, чтобы мои контроллеры содежали по одному методу.

Делаю так

Код

@Controller
@RequestMapping( value = "/catalog/{categoryId}", method = RequestMethod.PUT )
public class PutCategoryController
{
    @Autowired
    private CatalogService        catalogService;

    public String put( ModelMap map, @PathVariable Long categoryId, @ModelAttribute( "category" ) Category category )
    {
        ...
    }
}


Код

@Controller
@RequestMapping( value = "/catalog/{categoryId}", method = RequestMethod.GET )
public class GetCategoryController
{
    @Autowired
    private CatalogService    catalogService;

    public String get( ModelMap map, @PathVariable Long categoryId )
    {
        ...
    }
}


Но, понятное дело, методы не вызываются.

Тоесть я в type-level RequestMapping уникально сопоставил контроллер к пути. Теперь мне надо както указать, что единственный метод контроллера и будет обработчиком. Как это сделать?
PM   Вверх
ki6opr
Дата 21.6.2010, 02:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 20.12.2006

Репутация: нет
Всего: нет



Код

@Controller
@RequestMapping(value = "/login")
public class UserLogInController {

    @RequestMapping(method = RequestMethod.GET)
    public ModelAndView showPage(HttpSession session) {
        ModelAndView model = new ModelAndView("login");
        if (session != null) {
            AuthenticationException ex = (AuthenticationException) session.getAttribute(AbstractAuthenticationProcessingFilter.SPRING_SECURITY_LAST_EXCEPTION_KEY);
            if (ex != null) {
                model.addObject("error", ex.getMessage());
            }
        }
        return model;
    }
}


на методе тоже должна быть анотация @RequestMapping иначе спринг никогда не поймет какие методы он должен вызвать

Это сообщение отредактировал(а) ki6opr - 21.6.2010, 02:26
PM MAIL ICQ   Вверх
RZ_RZ
Дата 21.6.2010, 05:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 7.9.2006

Репутация: нет
Всего: нет



Цитата(ki6opr @ 21.6.2010,  02:23)
на методе тоже должна быть анотация @RequestMapping иначе спринг никогда не поймет какие методы он должен вызвать

Я понимаю. Я пытался на класс повесить @RequestMapping( value = "/catalog/{categoryId}", method = RequestMethod.PUT ) а на метод @RequestMapping( header="*" ), но всеравно ничего не вышло.
Вообще у меня проблема такая, есть каталог продукции, продукция по категориям. Имеем следующие шаблоны для URLов:
Код

GET /catalog - получить содержимое корневой категории
GET /catalog/{caegorytId} - получить содержимое определенной категории
POST / catalog - новая категория
PUT /catalog/{caegorytId} - редактирование категории
DELETE /catalog/{caegorytId} - удаление категории
GET /catalog/{caegorytId}/{subcaegorytId} - получить содержимое подкатегории
и т. д., еще около 15 методов

Тоесть если я напишу
Код

@RequestMapping("/catalog")
class ...
{
@RequestMapping("/{categoryId}")
public String get....
...
}

То у меня будет 20 методов в одном классе. Не очень удобно. Вот я и подумал, как можно разделить все это дело? Я бы предпочел 20 маленьких классов одному большому.
PM   Вверх
ki6opr
Дата 21.6.2010, 08:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 20.12.2006

Репутация: нет
Всего: нет



как написано в джава доках, если у вас в контроллере есть всего один метод и вы хотите что бы он был дефолтным для всех, аноитруйте его  
@RequestMapping
вот так будет выглядить ваш контроллер:
Код

@Controller
@RequestMapping( value = "/catalog/{categoryId}", method = RequestMethod.GET )
public class GetCategoryController
{
    @Autowired
    private CatalogService    catalogService;

    @RequestMapping
    public String get( ModelMap map, @PathVariable Long categoryId )
    {
        ...
    }
}



если не секрет
а остальные 15 методов это работа с подкатегориями ? 
если да, то возникает вопрос, а вы не можете работать с подкатегориями так же как и с категориями ?

тоесть GET /catalog/{caegorytId}/{subcaegorytId} не является для вас эквивалентом этой GET /catalog/{subcaegorytId} ?
просто мне кажется что неправильно CRUD контроллер разбивать на кучу контроллеров с одним действием, причем половина которых может быть заменена.
мне кажется что логичнее сдеалать так:
[id_базовой_категории=null, id_категории=1]-[id_базовой_категории=1, id_категории=2]-[id_базовой_категории=2, id_категории=3] и тд
тогда возможна неограниченая вложенность + везде это просто категория.

Это сообщение отредактировал(а) ki6opr - 21.6.2010, 08:09
PM MAIL ICQ   Вверх
RZ_RZ
Дата 21.6.2010, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 7.9.2006

Репутация: нет
Всего: нет



Цитата(ki6opr @ 21.6.2010,  08:03)
как написано в джава доках, если у вас в контроллере есть всего один метод и вы хотите что бы он был дефолтным для всех, аноитруйте его
@RequestMapping

Сделал два контроллера
Код

@Controller
@RequestMapping( value = "/catalog/{categoryId}", method = RequestMethod.GET )
public class GetCategoryController
{
    @Autowired
    private CatalogService    catalogService;

    @RequestMapping
    public String get( ... )
    {
        ...
    }
}

Код

@Controller
@RequestMapping( value = "/catalog/{categoryId}", method = RequestMethod.PUT )
public class PutCategoryController
{
    @Autowired
    private CatalogService    catalogService;

    @RequestMapping
    public String put( ... )
    {
        ...
    }
}

запустил, обновил страницу, получил это

Код

Looking for URL mappings in application context: WebApplicationContext for namespace 'myshop-servlet': startup
 date [Mon Jun 21 11:33:45 YEKST 2010]; parent: Root WebApplicationContext
Rejected bean name 'getCategoryController': no URL paths identified
Rejected bean name 'putCategoryController': no URL paths identified
Rejected bean name 'org.springframework.context.annotation.internalConfigurationAnnotationProcessor': no URL paths identified
Rejected bean name 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor': no URL paths identified
Rejected bean name 'org.springframework.context.annotation.internalRequiredAnnotationProcessor': no URL paths identified
Rejected bean name 'org.springframework.context.annotation.internalCommonAnnotationProcessor': no URL paths identified
Rejected bean name 'viewResolver': no URL paths identified
Rejected bean name 'tilesConfigurer': no URL paths identified
Rejected bean name 'org.springframework.web.servlet.handler.MappedInterceptor#0': no URL paths identified
Rejected bean name 'messageSource': no URL paths identified
Rejected bean name 'localeResolver': no URL paths identified
Rejected bean name 'servletConfig': no URL paths identified
Rejected bean name 'applicationEventMulticaster': no URL paths identified
Rejected bean name 'lifecycleProcessor': no URL paths identified
Looking for URL mappings in application context: WebApplicationContext for namespace 'myshop-servlet': startup
 date [Mon Jun 21 11:33:45 YEKST 2010]; parent: Root WebApplicationContext
Mapped URL path [/catalog/{categoryId}] onto handler [ru.rz.myshop.web.controllers.GetCategoryController@ae511]
Mapped URL path [/catalog/{categoryId}.*] onto handler [ru.rz.myshop.web.controllers.GetCategoryController@ae511]
Mapped URL path [/catalog/{categoryId}/] onto handler [ru.rz.myshop.web.controllers.GetCategoryController@ae511]
Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping': Initialization
 of bean failed; nested exception is java.lang.IllegalStateException: Cannot map handler [putCategoryController]
 to URL path [/catalog/{categoryId}]: There is already handler
 [ru.rz.myshop.web.controllers.PutCategoryController@144dff0] mapped.


Добавлено @ 08:55
Цитата(ki6opr @ 21.6.2010,  08:03)
если не секрет
а остальные 15 методов это работа с подкатегориями ? 
если да, то возникает вопрос, а вы не можете работать с подкатегориями так же как и с категориями ?

тоесть GET /catalog/{caegorytId}/{subcaegorytId} не является для вас эквивалентом этой GET /catalog/{subcaegorytId} ?
просто мне кажется что неправильно CRUD контроллер разбивать на кучу контроллеров с одним действием, причем половина которых может быть заменена.
мне кажется что логичнее сдеалать так:
[id_базовой_категории=null, id_категории=1]-[id_базовой_категории=1, id_категории=2]-[id_базовой_категории=2, id_категории=3] и тд
тогда возможна неограниченая вложенность + везде это просто категория.

Да, остальные 15 это работа с подкатегориями и с конечным продуктом (категория/подкатегория/товар).
Можно сделать так, как вы говорите. Но я хотел бы сделать УРЛ в том виде, в каком виртуально расположены ресурсы. Тоесть в категории находится подкатегория, а в подкатегории уже лежит товар. К тому же, возможно, в будущем появятся какието отличия категории от подкатегории, которые потребуют отдельного обработчика. Я подумал, что лучше это предусмотреть в начале пути.

Это сообщение отредактировал(а) RZ_RZ - 21.6.2010, 08:59
PM   Вверх
ki6opr
Дата 22.6.2010, 03:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 20.12.2006

Репутация: нет
Всего: нет



исключение говорит о том что у вас уже есть контроллер по такому урлу /catalog/{categoryId}, тоесть urlmapper игнорирует http методы в @RequestMapping
поэтому нужно, что бы методы по этому урлу были в одном классе, либо что бы урлы чем то отличались.
поэтому я бы тогда разделил контроллеры на контроллеры работающие с категориями и подкатегориями, если уж вы так хотите сделать.
но дальше дробить не очень хорошая идея имхо, если боитесь что будет много кода, сделайте этот контроллер фасадом а обработку делегируйте другим классам.


кстати
Spring mvs @RequestMapping
16.11.3.1 Advanced @RequestMapping options
написанно что поддерживаются Ant-style path patterns вида /owners/*/pets/{petId} может поможет


PM MAIL ICQ   Вверх
RZ_RZ
Дата 22.6.2010, 06:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 7.9.2006

Репутация: нет
Всего: нет



В том то и дело, что если я разделю контроллеры, на те, что с категориями, на те, что с подкатегориями и на те, что с продуктом, опять не получится разных урлов smile. Вот взгляните, есть категория, среди прочих операций, для нее есть операции получения и вставки:
GET /catalog/{categoryId} - вернуть категорию (список подкатегорий)
POST /catalog - вставить новую категорию
вот уже на двух этих операциях имеем разные пути. Тоесть сгруппировать контроллеры по пути конечно можно, но это уже получится совсем не логичная группировка, на мой взгляд.

Сейчас у меня в каждом обработчике по 3-6 строк кода, вроде не сильно напрягает размер класса, но в начале оно ведь всегда так smile Похоже придется воспользоваться вариантом с делегированием.

Спасибо smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0735 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.