Spring MVC комментирует методы контроллера, не может «найти» метод для операции DELETE - PullRequest
11 голосов
/ 23 марта 2012

Вот фактический код:

@RequestMapping(value = "/competitors/{id}", method = RequestMethod.GET)
public Competitor getCompetitor(@PathVariable("id") long id)
{
    Competitor competitor = competitorService.getCompetitorById(id);

    if (null == competitor)
    {
        EmptyResultDataAccessException e = new EmptyResultDataAccessException(1);
        logger.log(Level.WARN, e.getMessage());
        throw e;
    }

    return competitor;
}

@RequestMapping(value = "/competitors/{id}", method = RequestMethod.DELETE)
public String deleteCompetitor(@PathVariable("id") long id)
{
    Competitor competitor = new Competitor();
    competitor.setId(id);
    competitorService.deleteCompetitor(competitor);

    return "Solid gone!";
}

Отправка запроса DELETE в / Competitors / 200 приводит к ошибке:

"Статус HTTP 405 - Метод запроса« DELETE »не поддерживается"

В журнале Spring подтверждается, что маршрут к этому методу не найден:

5559 [tomcat-http--3] DEBUG org.springframework.web.servlet.DispatcherServlet  - DispatcherServlet with name 'dispatcher' processing DELETE request for [/vrsboserver/competitors/200] 5562 [tomcat-http--3] DEBUG org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
- Matching patterns for request [/competitors/200] are [/competitors/{id}] 5565 [tomcat-http--3] DEBUG org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
- Mapping [/competitors/200] to handler 'com.gtspt.vrsboserver.controllers.CompetitorController@4fe7f80' 5565 [tomcat-http--3] DEBUG org.springframework.web.servlet.mvc.WebContentInterceptor  - Looking up cache seconds for [/competitors/200] 5565 [tomcat-http--3] DEBUG org.springframework.web.servlet.mvc.WebContentInterceptor  - Applying default cache seconds to [/competitors/200] 5566 [tomcat-http--3] DEBUG org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver
- Resolving exception from handler [com.gtspt.vrsboserver.controllers.CompetitorController@4fe7f80]: org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'DELETE' not supported 5567 [tomcat-http--3] DEBUG org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver
- Resolving exception from handler [com.gtspt.vrsboserver.controllers.CompetitorController@4fe7f80]: org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'DELETE' not supported 5568 [tomcat-http--3] DEBUG org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver
- Resolving exception from handler [com.gtspt.vrsboserver.controllers.CompetitorController@4fe7f80]: org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'DELETE' not supported 5568 [tomcat-http--3] WARN  org.springframework.web.servlet.PageNotFound  - Request method 'DELETE' not supported

На что мой ответ" BUH? ".

Ответы [ 5 ]

4 голосов
/ 17 декабря 2012

У меня была такая же проблема. Что помогает, и это, вероятно, не окончательное решение, но работает для меня:

Изменение аннотаций и параметров метода deleteCompetitors . Удалить идентификатор (параметр метода тоже). Прочитайте параметр id из запроса HttpServletRequest.

@RequestMapping(value = "/competitors", method = RequestMethod.DELETE)
public String deleteCompetitor(HttpServletRequest request)
{
    String idHeader = request.getHeader("id");

    Integer id = Integer.valueOf(idHeader).intValue();

    Competitor competitor = new Competitor();
    competitor.setId(id);
    competitorService.deleteCompetitor(competitor);

    return "Solid gone!";
}

Параметр id передается заголовком таким образом (код клиента - не полный):

DefaultHttpClient httpClient = new DefaultHttpClient();

HttpDelete httpDelete = new HttpDelete...

...

httpDelete.setHeader("id", "123");

...

httpClient.execute(httpDelete);

Я использую Apache HttpClient.

1 голос
/ 13 июля 2012

Обычный браузер поддерживает только get / post.

Spring решил эту проблему, используя скрытый параметр, чтобы включить его, добавьте ниже в свой web.xml:

<filter>
    <filter-name>httpMethodFilter</filter-name>
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>httpMethodFilter</filter-name>
    <servlet-name>springDispatcher</servlet-name>
</filter-mapping>
0 голосов
/ 25 июля 2013

Я столкнулся с этой проблемой недавно.Вот несколько моих выводов / комментариев:

Я использую tomcat 7.0.42 с Spring 3.2.2

Следующее сообщение выкладывается в журнал во всех этих случаях.405 Метод «Не разрешен» возвращается клиенту.

org.springframework.web.servlet.PageNotFound  - Request method 'DELETE' not supported
  1. Используемый вами REST URL неверен.Даже если конечной точки нет, вы все равно получаете 405.
  2. Вы не вошли в систему и не авторизованы для выполнения каких-либо действий, не говоря уже о DELETE
  3. DELETE на самом деле не существуетподдерживается, потому что нет функции с методом = RequestMethod.GET
  4. Tomcat блокирует такие операции, как DELETE, PUT и т. д. из-за только для init-параметра readonly, установленного в true
  5. Метод присутствует,УДАЛЕНИЕ разрешено, все в порядке, за исключением того, что в методе

было исключение необработанного времени выполнения (например, исключение нулевого указателя). За исключением 3 и 4, показанное сообщение и ответ очень вводят в заблуждение.Он отправляет вас в разведочные кроличьи норы, которые в итоге оказываются бесплодными.

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

public void deleteSomething(HttpServletRequest request, HttpServletResponse response, @PathVariable("id") long id, @RequestParam String objectName);

Это ДОЛЖНО быть так:

public void deleteSomething(HttpServletRequest request, HttpServletResponse response, @PathVariable("id") long id, @RequestParam("objectName") String objectName);

Видите разницу?Это отсутствует ("objectName") после @RequestParam.Он компилируется и отлично работает в STS, но при непосредственном развертывании на сервере Tomcat он не работает.

Спасибо @fmelan за пост выше, потому что он помог нам найти эту маленькую опечатку.

Не похоже, что это была ваша проблема, но для всех, кто застрял, пытаясь понятьпочему DELETE не поддерживается ...

0 голосов
/ 18 сентября 2012

Вы пробовали это http://www.codereye.com/2010/12/configure-tomcat-to-accept-http-put.html? Это будет работать только, конечно, если вы работаете на Tomcat. Похоже, что большинство серверов приложений отключили возможность обработки запросов PUT и DELETE по умолчанию.

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

0 голосов
/ 23 марта 2012

Попробуйте изменить его на method = RequestMethod.GET и посмотрите, работает ли он.

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