Spring MVC请求映射 - 完整请求URI

时间:2014-12-04 10:10:55

标签: java spring rest spring-mvc web-applications

使用REST api创建或列出项目时,我还返回整个资源路径。

例如,创建人员记录会返回http://service:9000/person/1234作为回应。为了获得架构,主持人和端口部分如http://service:9000,我从HttpServletRequest.getRequestURL()获取的URL中提取它。

示例(不是生产代码,但在概念上相同):

@RequestMapping(value = "/person", method = RequestMethod.PUT)
public Object putPerson(
        @RequestParam(value = "name") String name,
            HttpServletRequest req) {

      long id = createPerson(name);
      String uriStart = RestUtils.getSchemeHostPortUrlPart(req
            .getRequestURL().toString());
      String uri = uriStart + "/person/" + id;
      Person person = new Person(name, id, uri);

      return person; //Serialized to json by Spring & Jackson
}

//Simple bean-like class
public class Person {  
//Getter methods for uri, name & id
}

由于这是一个相当于每个方法重复的锅炉板代码,我想知道Spring是否支持这个在阅读它的文档时没有得到支持。

我的意思是访问任何一个URL而不需要HttpServletRequest,或者甚至更好地访问它的架构,主机,端口部分。

4 个答案:

答案 0 :(得分:3)

该文档提供了大量examples,用于使用UriComponentsBuilder构建URI。

此外,如果您想将REST API提升到新的水平,我建议您查看Spring HATEOAS

顺便说一句:PUT意味着你要替换资源,这不是这里的情况。您可以POST到/person或PUT到此人自己的URI,例如/person/1234

答案 1 :(得分:2)

您可以在拦截器中构建URI(在控制器方法之前执行)并将其作为属性放置并在控制器方法中使用它。

答案 2 :(得分:1)

我相信这很简单。看看这个例子:

@RequestMapping(value = "/person", method = RequestMethod.PUT)
public Object putPerson(@RequestParam(value = "name") String name, HttpServletRequest req) {

  long id = createPerson(name);
  Person person = new Person(id, name, req);

  return person; //Serialized to json by Spring & Jackson
}

public class JsonResponse {

    private String url;

    public JsonResponse(HttpServletRequest request) {
        url = request.getRequestURI() + "?" + request.getQueryString();
    }

    public final String url() {
        return url;
    }
}

public class User extends JsonResponse {

    private Long   id;
    private String name;

    public User(Long id, String name, HttpServletRequest request) {
        super(request);
        this.id = id;
        this.name = name;
    }

    // Getter, Setter

}

答案 3 :(得分:1)

您可以像这样使用org.springframework.web.servlet.support.ServletUriComponentsBuilder

String uri = ServletUriComponentsBuilder.fromCurrentRequest()
    .replacePath("/person/{id}")
    .buildAndExpand(id)
    .toUriString();