2013-02-20 38 views
0

我有一個基於Spring MVC的REST服務。Spring MVC RequestMapping正在被轉發

這是我的代碼:

public class SitesController { 

@RequestMapping(value="/rest/sites/{id}", method=RequestMethod.GET) 
@ResponseBody 
public SiteDTO getSite(@PathVariable String id) { 
    Integer siteId = Integer.parseInt(id); 

    Site site = cms.getSite(siteId); 
    SiteDTO siteResult = new SiteDTO(site); 
    return siteResult; 
} 

@RequestMapping(value="/rest/sites", method=RequestMethod.GET) 
public SitesResult getSites(@RequestParam Integer companyId) { 
    Collection<Site> sites = cms.getSites(cms.getCompany(companyId)); 
    SitesResult sitesResult = new SitesResult(sites); 
    return sitesResult; 
} 

} 

(我跳過一些代碼,並不適用於這個問題)

當我去到URL /rest/sites/1它返回的是我所期望的數據,但是當我去/rest/sites?companyId=1時,我得到一個404頁面:HTTP Status 404 - /rest/rest/sites

的日誌中顯示,在getSites函數的代碼運行,但在此之後的日誌中顯示以下內容:org.springframework.web.servlet.view.JstlView Forwarding to resource [rest/sites] in InternalResourceView 'rest/sites'

爲什麼重定向,而不是執行?

UPDATE

發現問題。因爲我的方法上面沒有@ResponseBody,調度程序轉發了我的請求。更多信息here,事情的關鍵是If the method is annotated with @ResponseBody, the return type is written to the response HTTP body. The return value will be converted to the declared method argument type using HttpMessageConverters.

+0

什麼樣的對象是'SitesResult'? – 2013-02-20 15:15:31

回答

1

因爲你的方法返回類型SitesResult不是supported return types之一,Spring將使用它的類名加上返回的對象爲Model,並試圖呈現由您的請求映射值命名視圖,這就是爲什麼它是試圖呈現/rest/sites。它實際上並不是在執行HTTP轉發,而是一個調度器轉發,它是servlets呈現視圖所做的操作(例如,jsp)。

如果要返回特定視圖,請返回包含其名稱的字符串。

相反

@RequestMapping(value="/rest/sites", method=RequestMethod.GET) 
public SitesResult getSites(@RequestParam Integer companyId) { 
    Collection<Site> sites = cms.getSites(cms.getCompany(companyId)); 
    SitesResult sitesResult = new SitesResult(sites); 
    return sitesResult; 
} 

做這個

@RequestMapping(value="/rest/sites", method=RequestMethod.GET) 
public String getSites(@RequestParam Integer companyId, Model model) { 
    Collection<Site> sites = cms.getSites(cms.getCompany(companyId)); 
    SitesResult sitesResult = new SitesResult(sites); 
    model.addAttribute("sitesResult", sitesResult); 
    String myView = "myView"; 
    return myView; 
} 
+0

謝謝,我發現我的問題和解決方案。當你提到'支持的退貨類型'時,你給了我一個想法。我錯過了我的方法上方的'@ ResponseBody'註釋。這解決了我的問題 – 2013-02-20 15:38:59

0

這只是我的猜測而已......

方法getSites可以聲明爲:

public SitesResult getSites(@RequestParam("companyId") Integer companyId) { 

我不知道這是否會有什麼影響?

或者它可能是指定的邏輯視圖名稱不映射到視圖?