我有一个基于 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;
}
}
(我跳过了一些不适用于该问题的代码)
当我访问 URL /rest/sites/1
时,它返回我期望的数据,但是当我访问 /rest/sites?companyId=1
时> 我收到 404 页面:HTTP Status 404 -/rest/rest/sites
。
日志显示 getSites
函数中的代码已运行,但之后日志显示以下内容:org.springframework.web.servlet.view.JSTLView 转发到InternalResourceView 'rest/sites' 中的资源 [rest/sites]
为什么是重定向而不是执行?
更新
发现问题了。因为我的方法上方没有 @ResponseBody
,所以调度程序转发了我的请求。更多信息here ,关键是如果该方法用@ResponseBody注释,则返回类型将写入响应HTTP正文。返回值将使用 HttpMessageConverters 转换为声明的方法参数类型。
最佳答案
因为您的方法返回类型 SitesResult
不是 supported return types 之一,Spring 将使用其类名将返回的对象添加到 Model
中,并尝试渲染一个由请求映射的值命名的 View ,这就是它尝试渲染 /rest/的原因网站
。它实际上并不是在执行 HTTP 转发,而是调度程序转发,这是 servlet
用来呈现 View 的操作(例如 jsp
)。
如果要返回特定 View ,请返回包含其名称的字符串。
相反
@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;
}
关于java - Spring MVC RequestMapping 正在转发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14982767/