2012-08-16 44 views
2

在升級我的應用程序使用可用的最新版本Spring來我(3.1.1),我發現我的REST調用之一拋出404錯誤(當它使用的是完美的成功的)。我已經驗證切換回舊庫(3.0.3)的工作,並返回到新的失敗,都不改變我的代碼。Spring版本變化導致REST風格的功能,打破

@Controller 
@RequestMapping("/group/{groupId}/template") 
public class TemplateController extends AbstractController { 
    ... 

    @RequestMapping(value="/{templateId}", method=RequestMethod.GET) @ResponseBody 
    public Template getTemplate(ServletWebRequest request, 
      @PathVariable("groupId") int groupId, 
      @PathVariable("templateId") int templateId) throws Exception { 
     ... 
    } 

    ... 

    @RequestMapping(value="/{templateId}", method=RequestMethod.DELETE) @ResponseBody 
    public Task getTemplate(ServletWebRequest request, 
      @PathVariable("groupId") int groupId, 
      @PathVariable("templateId") int templateId) throws Exception { 
     ... 
    } 

    ... 
} 

我把GET方法扔在那裏只是爲了比較,它的工作原理。然而,當我做了DELETE方法(同樣,其用於工作)的要求,我得到一個錯誤,回到日誌中指出:

WARNING: No mapping found for HTTP request with URI [/*appname*/group/1/template/group/1/template/1] in DispatcherServlet with name '*appname*' 

現在,誤差顯然是正確的,我沒有任何具有該映射的URI,但它爲什麼試圖找到該映射而不是指定的映射(/*appname*/group/1/template/1)?

+0

我不能在所有複製這種行爲與Spring MVC 3.1.1(用GET和DELETE電話),您可以請檢查,如果客戶端不發送不同的東西? – 2012-08-16 23:42:39

+0

@Biju Kunjummen我正在使用Linux的curl發送這些調用,因此客戶端問題不應該成爲問題。另外,我還有其他控制器可以匹配這個功能,只適用於不同的項目,而且它們工作正常。我甚至把一個工作控制器的DELETE函數粘貼到這個函數中,並得到了相同的錯誤。 – frisbeetarian 2012-08-17 03:10:02

回答

0

我仍然不知道爲什麼我得到的是出現了錯誤,所以洞察春天的內部運作,將不勝感激,但我沒弄清楚是什麼導致它。與其他方法相比,唯一不同的是它拋出了一個例外,而另一些則不是。在我註釋掉我的ExceptionHandler之後,該函數正確註冊。

@ExceptionHandler(Exception.class) 
public Map<String, String> handleExceptions(Exception e) { 
    ... 
} 

我仍然不知道爲什麼這導致它的錯誤,但諷刺的是,這是我在第一時間升級了庫的原因:使異常處理將正常工作。在將函數@ResponseBody添加到函數(我首先要做的)之後,一切正常。

0

及其治療/在由該方法@RequestMapping值去除/值作爲一個根試映射。

@RequestMapping(value="{templateId}", method=RequestMethod.DELETE) @ResponseBody 
    public Task getTemplate(ServletWebRequest request, 
      @PathVariable("groupId") int groupId, 
      @PathVariable("templateId") int templateId) throws Exception { 
     ... 
    } 
+0

這是一個很好的想法,但我最終得到了同樣的結果。我試圖遵循[Spring做它](http://static.springsource.org/spring/docs/current/spring-framework-reference/html/mvc.html)(請參閱第16.3.2節)。另外,爲什麼GET會使用它,但不是DELETE? – frisbeetarian 2012-08-17 03:02:56