在Spring MVC中创建新资源的RESTful方法究竟如何工作?

时间:2015-03-01 16:31:40

标签: java spring rest spring-mvc annotations

我正在攻读Spring Core认证,对于要求更改此方法的执行内容我有以下疑问:

/**
 * Adds a Beneficiary with the given name to the Account with the given id,
 * setting its URL as the Location header on the response. 
 */
// TODO 11: Complete this method. Add annotations to respond to a
//          POST /accounts/{accountId}/beneficiaries containing a beneficiary name
//          with a 201 Created status
@RequestMapping(value = "/accounts/{accountId}/beneficiaries", method = RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
public void addBeneficiary(
                           long accountId, 
                           String beneficiaryName,
                           HttpServletRequest request, 
                           HttpServletResponse response) {
    accountManager.addBeneficiary(accountId, beneficiaryName);
    //  TODO 12: Set the Location header on the Response to the location of the created beneficiary.
    //  Note the existing entityWithLocation method below.
}

根据前面代码片段中显示的TODO进入RESTfull方法。

这是解决方案,但我有一些问题需要了解它是如何工作的:

/**
 * Adds a Beneficiary with the given name to the Account with the given id,
 * setting its URL as the Location header on the response.
 */
@RequestMapping(value = "/accounts/{accountId}/beneficiaries", method = RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
public HttpEntity<String> addBeneficiary(
        @PathVariable("accountId") long accountId,
        @RequestBody String beneficiaryName,
        @Value("#{request.requestURL}") StringBuffer url) {
    accountManager.addBeneficiary(accountId, beneficiaryName);
    return entityWithLocation(url, beneficiaryName);
}

所以 TODO 11 向我询问以下内容:添加注释以回复 POST / accounts / {accountId} /受益人,其中包含受益人姓名< strong> 201创建状态。

所以我认为提出的解决方案是这样运作的:

  1. 使用 @RequestMapping 处理** POST Http请求**对 / accounts / {accountId} / faviciaries URL(REST样式表示资源,它是否严格?)

    @RequestMapping(value = "/accounts/{accountId}/beneficiaries", method = RequestMethod.POST)
    

    其中 {accountId} 是路径变量。例如,此方法处理的网址类似于&#34; / accounts / 123 /受益人&#34;其中 123 值存储在名为 accountId 的变量中,然后我可以在我的代码中使用,实际上是 @PathVariable 注释我检索到这个我用作 addBeneficiary()方法的输入参数的值。

    @ResponseStatus(HttpStatus.CREATED)注释将响应的状态设置为 201 ,表示新资源已正确创建。

  2. 好的,现在我的主要疑虑如下:

    1) addBeneficiary()方法输入参数之一是:

    @RequestBody String beneficiaryName
    

    我认为它从HttpRequest中提取 String beneficiaryName ,是不是。但是,如果以这种方式工作,调用者(发送HttpRequest的人)如何将此参数放入Http请求?

    2)进入原始方法(改为运动解决方案的方法)有这两个输入参数: HttpServletRequest请求 HttpServletResponse响应我认为代表 HttpRequest HttpResponse 由旧式Servlet应用程序处理。

    这些参数由以下参数替换:

    @Value("#{request.requestURL}") StringBuffer url
    

    我认为它检索生成HttpRequest的URL。是不是?

    这是一回事吗?:

    HttpRequest request.getRequestURL();
    

1 个答案:

答案 0 :(得分:0)

以下是您的问题的答案。

  1. 调用者(发送HttpRequest的人)如何将此参数放入Http请求?
  2. 调用者可以触发将JSON传递给控制器​​的ajax请求。这是发送将使用@RequestBody注释提取的数据的方法之一。当调用者使用JSON数据执行ajax发布时,Spring将使用转换器进行转换并将其传递给您的方法。您需要在类路径上安装JACKSON jar。

    1. @Value(“#{request.requestURL}”) StringBuffer网址。这与 request.getRequestURL()相同。 Spring正在使用SPEL从对象中获取数据。 SPEL的使用方式与此类似,例如从使用spring注入的Properties对象中获取特定属性。