在spring启动控制器中使用@RequestMapping时访问资源的绝对路径

时间:2018-02-08 21:11:56

标签: spring spring-mvc spring-boot request-mapping

我正在使用@RquestMapping将url映射到控制器方法。

@RestController
@RequestMapping(path = "/api/tasks")
public class TaskController { ....

并且控制器内部的方法具有/{id}请求映射注释。

 @RequestMapping(
    path = "/{taskId},
    method = RequestMethod.GET
)
public Map<String, Object> methodOne(...

我想在里面访问该方法的http方法和绝对路径(已配置的路径)。

即。我想将/api/tasks/{taskId}作为值(不是/api/tasks/1,如果api被调用为任务ID 1),GET作为methodOne内部的方法。

我检查了HandlerMapping但它返回了客户端调用的实际资源路径。不是方法/资源的已配置路径。

任何帮助或指导都将受到高度赞赏。谢谢。

4 个答案:

答案 0 :(得分:0)

@RequestMapping(path = "/{id}", method = [RequestMethod.DELETE])
public void test(@PathVariable("id") String id, HttpServletRequest request) {
   \\ Code Here
}

在方法参数中,id是pathVariable。请求方法可以在请求变量中访问(虽然我不知道有什么意义,因为你限制它只接受GET请求)

答案 1 :(得分:0)

根据@codedetector的建议,最好的选择是如果你有请求对象,或者你可以添加一个,如果你没有它。

@RequestMapping(path = "/{taskId}, method = RequestMethod.GET)
public String methodOne(HttpServletRequest request){
   String test = request.getRequestURI();
   return test;
 }

如果您的方法中没有请求对象,请使用以下代码获取系统上的任何URL。

import org.springframework.hateoas.mvc.ControllerLinkBuilder
 ...
ControllerLinkBuilder linkBuilder =  ControllerLinkBuilder.linkTo(methodOn(YourController.class).getSomeEntityMethod(parameterId, parameterTwoId))

URI methodUri = linkBuilder.Uri()
String methodUrl = methodUri.getPath()

--------编辑 我不确定为什么你需要这种格式&#34; / api / tasks / {taskId}&#34;作为值(不是/ api / tasks / 1)但我可以考虑使用常量将它用于@RequestMapping路径参数,然后在获得绝对路径后轻松地将其替换/附加到该常量。

String pathParam ="/{taskId}"

答案 2 :(得分:0)

String[] pathReqMappingAnnotationOnControllerClass = this.getClass().getAnnotation(RequestMapping.class).path();

Method method = TaskApiController.class.getMethod("getListOfTasks", HttpServletRequest.class, HttpServletResponse.class);

String[] pathReqMappingAnnotationOnControllerMethod = method.getAnnotation(RequestMapping.class).path();

String wholePath = pathReqMappingAnnotationOnControllerClass[0] + pathReqMappingAnnotationOnControllerMethod[0];
//pathReqMappingAnnotationOnControllerMethod will be empty array if method is not annotated for path

答案 3 :(得分:0)

@RequestMapping(path = "/{id}", method = [RequestMethod.DELETE])
public void test(@PathVariable("id") String id, HttpServletRequest request) {
    switch(id){
        case 1:
            method1();
            break;
        case 2:
            method2();
            break
        ....
        ....
    }
}
private void method1(){};
private void method2(){};
private void method3(){};