0

我有一个基于 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=1404 页面时:HTTP Status 404 - /rest/rest/sites

日志显示getSites函数中的代码已运行,但之后日志显示以下内容:org.springframework.web.servlet.view.JstlView Forwarding to resource [rest/sites] in InternalResourceView 'rest/sites'

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

更新

发现了问题。因为我没有@ResponseBody上面我的方法,调度员转发了我的请求。更多信息在这里,关键是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.

4

2 回答 2

1

因为您的方法返回类型SitesResult不是受支持的返回类型之一,所以 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;
}
于 2013-02-20T15:20:53.933 回答
0

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

方法 getSites 可以声明为:

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

不知道这样会不会有影响?

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

于 2013-02-20T15:03:18.327 回答