java - Spring MVC RequestMapping 正在转发

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

}

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

当我访问 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/

相关文章:

java - java.lang.NoSuchMethodError:org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorContextImpl

java - Spring MVC defaultHtmlEscape - 它在进出的路上工作吗?

java - 如何不将 json 中的空值显示为 jax-rs 的响应

scala - Akka HTTP 根据 Future 的结果设置响应头

java - 如何从java代码中绘制序列图

java - 如何为 JComboBox 定义通用 "POJO"ListCellRenderer

java - Spring & JDBCTemplate : are resources automatically closed when using the underlying datasource?

php - 如何从使用 Paypal rest-api-sdk-php 库完成的请求中获取 token

java - 从具有相同成员的列表中过滤对象

spring - 如何从@Bean返回一个依赖于其他bean的bean