正在转发Spring MVC RequestMapping

时间:2013-02-20 14:51:52

标签: java spring rest spring-mvc

我有一个基于Spring MVC的REST服务。

这是我的代码:

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;
}

}

(我跳过了一些不适用于该问题的代码)

当我转到网址/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'

为什么重定向而不是执行?

更新

发现问题。因为我的方法上面没有@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.

2 个答案:

答案 0 :(得分:1)

因为您的方法返回类型SitesResult不是supported return types之一,所以Spring会使用其类名将返回的对象添加到Model并尝试呈现由您的请求映射的值,这就是它尝试呈现/rest/sites的原因。它实际上并不是在进行HTTP转发,而是调度转发,这是servlets用于呈现视图的内容(例如。jsp)。

如果要返回特定视图,请返回包含其名称的String。

相反

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

答案 1 :(得分:0)

这只是我的猜测......

方法getSites可以声明为:

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

我不知道这会不会有任何影响?

或者可能是指定的逻辑视图名称没有映射到视图?