2014-04-28 57 views
8

嗯,我在Spring中執行「DELETE」HTTP請求時出現了一個奇怪的問題。Spring - 405 Http方法此URL不支持DELETE

我有我制訂一個DELETE請求到一個控制器方法:

@RequestMapping(value = "/{authorizationUrl}",method=DELETE) 
    public void deleteAuthorizationServer(
      @RequestHeader(value="Authorization") String authorization, 
      @PathVariable("authorizationUrl") String authorizationUrl) 
      throws IOException { 

     System.out.println("TEST"); 

    } 

控制器使用@RequestMapping("/authorization_servers"); 當我通過我的DEV HTTP客戶端發送一個請求,我收到響應映射:405 Http method DELETE is not supported by this URL

的要求是這樣的:

DELETE localhost:8080/authorization_servers/asxas 

    Headers: 
    Authorization: "test:<stuff>" 

如果有人來調查此事,並幫助我,我將不勝感激

+0

你對控制器類本身有什麼映射?你有沒有設置@ApplicationPath? – jgitter

+0

謝謝!我有這個'@RequestMapping(「/ authorization_servers」)' –

+0

按照建議將它移動到註釋中。該方法由Ajax調用,對嗎? – geoand

回答

13

這將工作:

@RequestMapping(value = "/{authorizationUrl}", method = DELETE) 
public @ResponseBody void deleteAuthorizationServer(@RequestHeader(value="Authorization") String authorization, 
                @PathVariable("authorizationUrl") String authorizationUrl){ 
    System.out.printf("Testing: You tried to delete %s using %s\n", authorizationUrl, authorization); 
} 

你失蹤了@ResponseBody。你的方法實際上被調用;那是產生錯誤代碼之後發生的事情。

+0

非常感謝!那完美的作品! –

+0

*呻吟*不能相信我錯過了 – jgitter

+2

這真的不應該給一個405如果是這樣,它是春天有個錯誤。 –

2

你的註釋應該是這樣的:

@RequestMapping(value = "/{authorizationUrl}",method=RequestMethod.DELETE) 

我不知道你從哪裏得到那個DELETE變量。 :-)

+2

OP可能已使用DELETE的靜態導入。但是,如果不是,很好! – geoand

+0

謝謝你的時間,但是我沒有靜態導入從春天DELETE: '進口靜態org.springframework.web.bind.annotation.RequestMethod.DELETE;' –

+0

爆炸!回到繪圖板。 – jgitter

1

如果@RequestMapping模式不匹配或者是無效,則會導致找不到404。但是,如果碰巧用另一種方法(例如GET)匹配另一個映射,則會導致此405 Http method DELETE is not supported

我的問題就像這個,除了我的requestMapping是原因。是這樣的:

@RequestMapping(value = { "/thing/{id:\\d+" }, method = { RequestMethod.DELETE }) 

你看到了嗎?內部右大括號缺失,它應該是:{ "/thing/{id:\\d+}" }\\d+是一個正則表達式,用於匹配一個或多個數字。大括號用@PathVariable分隔路徑中的參數。

由於它是無效的不能匹配我的DELETE請求: http://example.com/thing/33 這將導致在沒有找到404錯誤,但是,我對GET另一個映射:

@RequestMapping(value = { "/thing/{id:\\d+}" }, method = { RequestMethod.GET }) 

由於支柱模式是正確的,但它不是一個方法DELETE,那麼它給出了不支持的錯誤405方法。

希望這可以幫助你!

0

也確保你用"Content-Type" header="text/html"來調用它。如果不是,則更改它或在requestMapping中指定它。如果它不匹配,你會得到相同的405.

希望這可以幫助某人。

相關問題