Я пытаюсь создать RESTful контроллер, используя Spring 3.0. Контроллер предназначен для API управления приложением портала. Я хочу выполнить следующие операции:
- GET / api / portals для вывода списка всех порталов
- POST / api / portals для создания нового портала
- GET / api / portals / {id} для извлечения существующего портала
- PUT / api / portals / {id} для обновления существующего портала
- УДАЛИТЬ / api / portal / {id}, чтобы удалить существующий портал
После аннотирования контроллера, как показано ниже, я обнаружил, что операции для вывода списка всех порталов или создания нового портала не отображаются.
Итак, мои вопросы:
- Правильно ли я прокомментировал класс?
- Соблюдаю ли я правильные соглашения для реализации веб-службы RESTful?
- Может ли быть что-то сломанное весной?
В приведенном ниже фрагменте кода показано, как я комментировал свой класс:
@Controller
@RequestMapping("/api/portals")
public final class PortalAPIController
{
private final static Logger LOGGER = LoggerFactory.getLogger(PortalAPIController.class);
@RequestMapping(value = "/", method = RequestMethod.GET)
public String listPortals(final Model model)
{
PortalAPIController.LOGGER.debug("Portal API: listPortals()");
.
.
return "portals";
}
@RequestMapping(value = "/", method = RequestMethod.POST)
public String createPortal(@RequestBody final MultiValueMap<String, String> portalData, final Model model)
{
PortalAPIController.LOGGER.debug("Portal API: createPortal()");
.
.
return "portal";
}
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public String getPortal(@PathVariable("id") final String portalId, final Model model, final HttpServletResponse response)
throws IOException
{
PortalAPIController.LOGGER.debug("Portal API: getPortal()");
.
.
return "portal";
}
@RequestMapping(value = "/{id}", method = RequestMethod.PUT)
public String updatePortal(@PathVariable("id") final String portalId,
@RequestBody final MultiValueMap<String, String> portalData, final Model model, final HttpServletResponse response)
throws IOException
{
PortalAPIController.LOGGER.debug("Portal API: updatePortal()");
.
.
return "portal";
}
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
public String deletePortal(@PathVariable("id") final String portalId, final Model model, final HttpServletResponse response)
throws IOException
{
PortalAPIController.LOGGER.debug("Portal API: deletePortal()");
.
.
return "portal";
}
.
.
}
Во время запуска я вижу, что у Spring есть конечные точки:
2010-02-19 01:18:41,733 INFO [org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping] - Mapped URL path [/api/portals/] onto handler [com.btmatthews.mars.portal.web.controller.PortalAPIController@141717f]
2010-02-19 01:18:41,734 INFO [org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping] - Mapped URL path [/api/portals/{id}] onto handler [com.btmatthews.mars.portal.web.controller.PortalAPIController@141717f]
2010-02-19 01:18:41,734 INFO [org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping] - Mapped URL path [/api/portals/{id}.*] onto handler [com.btmatthews.mars.portal.web.controller.PortalAPIController@141717f]
2010-02-19 01:18:41,735 INFO [org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping] - Mapped URL path [/api/portals/{id}/] onto handler [com.btmatthews.mars.portal.web.controller.PortalAPIController@141717f]
2010-02-19 01:18:41,735 INFO [org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping] - Mapped URL path [/api/portals] onto handler [com.btmatthews.mars.portal.web.controller.PortalAPIController@141717f]
2010-02-19 01:18:41,735 INFO [org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping] - Mapped URL path [/api/portals.*] onto handler [com.btmatthews.mars.portal.web.controller.PortalAPIController@141717f]
Но когда я пытаюсь вызвать мой API, используя cURL
curl http://localhost:8080/com.btmatthews.minerva.portal/api/portals/
или
curl http://localhost:8080/com.btmatthews.minerva.portal/api/portals
Я получаю следующие ошибки:
2010-02-19 01:19:20,199 WARN [org.springframework.web.servlet.PageNotFound] - No mapping found for HTTP request with URI [/com.btmatthews.minerva.portal/api/portals] in DispatcherServlet with name 'portal'
2010-02-19 01:19:32,360 WARN [org.springframework.web.servlet.PageNotFound] - No mapping found for HTTP request with URI [/com.btmatthews.minerva.portal/api/portals/] in DispatcherServlet with name 'portal'
У меня возникает та же проблема, когда я пытаюсь создать:
curl -F ...... --request POST http://localhost:8080/com.btmatthtews.minerva/api/portals
Но если попытаться работать с существующим ресурсом (получить, обновить или удалить), все будет хорошо.
Обновление: Решение было предоставлено в комментарии @ axtavt . Я использовал / api / * </ url-pattern> в своем отображении сервлета web.xml. Его нужно изменить на / </ url-pattern>