Как настроить контроллер RESTful в Spring 3 с аннотациями? - PullRequest
6 голосов
/ 19 февраля 2010

Я пытаюсь создать 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>

Ответы [ 4 ]

4 голосов
/ 20 августа 2010

Дважды проверьте url-pattern в вашем web.xml и сравните его с аргументом curl.

Вот пример , который я написал, который проведет вас через весь процесс Spring MVC.

0 голосов
/ 15 декабря 2017

В Spring 3 Rest Controller - это не более чем обычный контроллер (@Component), и единственное отличие состоит в том, что Rest-контроллер возвращает JSON / XML вместо «Views».Поэтому я думаю, что у вас все хорошо с аннотациями.Однако две отсутствующие вещи, которые я не вижу: 1- Каждый метод должен иметь значение «производить» (для согласования содержимого): @RequestMapping (value = "/ {id}", method = RequestMethod.GET, производит = "application / json ")

2 - вам нужен объектный тип некоторого типа (например, Marshaller и Unmarshaller), чтобы иметь возможность отображать объекты в JSON / XML и наоборот.Эти два должны быть в вашей конфигурации сервлета, а не настраивать преобразователь представления.И это должно быть.

0 голосов
/ 13 января 2016

Вы допустили несколько ошибок.

@RequestMapping(value = "/", method = RequestMethod.GET)

public String listPortals(final Model model)
{
}

Здесь метод должен принимать некоторый параметр Model, но он не передается.Вы должны написать это внутри метода.или если вы хотите передать это, вы должны отправить его как переменную пути или как параметр запроса.

@RequestMapping(value = "/{id}", method = RequestMethod.GET)

public String getPortal(@PathVariable("id") 

здесь правильный синтаксис: @PathVariable(value="id")

И если это не такработать, а затем попробуйте это:

@RequestMapping(value = "/SOMETHING", method = RequestMethod.GET)
0 голосов
/ 19 февраля 2010

URL, который вы публикуете в своем отрывке

http://localhost:8080/portal/api/portals

не соответствует URL-адресу в предупреждении Spring

/com.btmatthews.minerva.portal/api/portals

Не зная, как настроено ваше веб-приложение, каков его контекстный путь, как выглядит контекст Spring и т. Д., Его довольно сложно диагностировать, но это звучит для меня как подсказка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...