我有一个基于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.
答案 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) {
我不知道这会不会有任何影响?
或者可能是指定的逻辑视图名称没有映射到视图?