2012-03-23 5 views
11

Oto rzeczywisty kod:Wiosna MVC metody opisywane kontroler, niezdolni do „znaleźć” sposób operacja usuwania

@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!"; 
} 

Wysyłanie DELETE żądanie/konkurencji/200 powoduje błąd:

" HTTP status 405 - metoda żądania 'DELETE' not supported”

rejestrowanie od wiosny potwierdza, że ​​żadna droga do tej metody można znaleźć:

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 '[email protected]' 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 [[email protected]]: 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 [[email protected]]: 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 [[email protected]]: org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'DELETE' not supported 5568 [tomcat-http--3] WARN org.springframework.web.servlet.PageNotFound - Request method 'DELETE' not supported 

Do której moja odpowiedź brzmi "BUH?".

+0

Czy wszystkich słoikach wiosnę sama wersja? –

+0

Po prostu sprawdziłeś, czy GET działa na tym samym mapowaniu? – smp7d

+0

GET zdecydowanie działa. Maven pobiera moje słoiki wiosenne, używając "$ {org.springframework.version}" jako pola każdej wersji, więc z pewnością wszystkie pasują. – Archeus

Odpowiedz

0

Spróbuj zmienić go na method = RequestMethod.GET i sprawdź, czy działa.

+0

Metoda z podpisem GET już istnieje (patrz kod wysłany) i działa. – Archeus

+0

W jaki sposób mówisz przeglądarce, aby wysłała żądanie DELETE? Gdzie jest ten zestaw nagłówków? Podobnie jak w tym linku: http://www.ibm.com/developerworks/webservices/library/wa-restful/index.html?ca=drs- – duffymo

+0

Czy używasz metody = DELETE w formularzu? Jestem ciekawy, bo szczerze nie wiem. – duffymo

1

Normalna przeglądarka obsługuje tylko pobieranie/wysyłanie.

Wiosna to rozwiązane za pomocą ukrytego parametru, aby ją włączyć, należy dodać poniższy odnośnik do 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> 
4

Miałem ten sam problem. Co pomaga i prawdopodobnie nie jest to ostateczne rozwiązanie, ale działa dla mnie:

Zmiana adnotacji i parametrów metody deleteCompetitors. Usuń id (również parametr metody). Przeczytaj parametr id z 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!"; 
} 

parametr id jest przekazywane przez nagłówek tędy (kod klienta - nie zakończyć):

DefaultHttpClient httpClient = new DefaultHttpClient(); 

HttpDelete httpDelete = new HttpDelete... 

... 

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

... 

httpClient.execute(httpDelete); 

Używam Apache httpclient.

0

Wpadłem ostatnio na ten problem. Oto kilka moich ustaleń/komentarz:

Używam Tomcat 7.0.42 z wiosny 3.2.2

Poniższa wiadomość jest wypluć na pniu w każdym z tych przypadków. 405 Metoda niedopuszczalna jest zwracana do klienta.

org.springframework.web.servlet.PageNotFound - Request method 'DELETE' not supported 
  1. REST URL używasz jest źle. Mimo, że punkt końcowy nie ma, ty wciąż dostać 405.
  2. Nie jesteś zalogowany i nie są uprawnione do wykonywania jakichkolwiek działań, nie mówiąc już DELETE
  3. DELETE faktycznie nie jest obsługiwana, ponieważ nie ma funkcji with method = RequestMethod.GET
  4. Tomcat blokuje operacje takie jak DELETE, PUT, itp.ze względu na tylko do odczytu startowe param zestawu do prawdziwego
  5. Sposób ten jest obecny, usuwania jest dozwolone, wszystko jest w porządku, z wyjątkiem nie był wyjątkiem przechwycony wykonawczego (np NULL wyjątku) w sposobie

Z wyjątkiem 3 i 4, pokazany komunikat i odpowiedź są bardzo mylące. Wysyła ci śledzące dziury w królikach, które kończą się bezowocnym.

Co zakończył się moim problemem jest to, że mieliśmy metody takie jak to:

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

Należy to:

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

Zobacz różnicę? To jest brakujące ("objectName") po @RequestParam. Kompiluje się i działa dobrze w STS, ale po wdrożeniu bezpośrednio na serwerze Tomcat nie działa.

Dzięki @ fmelan za powyższy wpis, ponieważ pomógł nam znaleźć tę małą literówkę.

To nie wygląda jakby to był problem, ale dla każdego, kto tkwi próbuje dowiedzieć się, dlaczego „DELETE” nie jest obsługiwany ...