Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在spring引导控制器中使用@RequestMapping时访问资源的绝对路径_Spring_Spring Mvc_Spring Boot_Request Mapping - Fatal编程技术网

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

在spring引导控制器中使用@RequestMapping时访问资源的绝对路径,spring,spring-mvc,spring-boot,request-mapping,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>

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

@RestController
@RequestMapping(path = "/api/tasks")
public class TaskController { ....
控制器中的方法具有带有请求映射注释的/{id}

 @RequestMapping(
    path = "/{taskId},
    method = RequestMethod.GET
)
public Map<String, Object> methodOne(...
我想访问http方法和内部为该方法配置的绝对路径路径

i、 e.如果为任务id 1调用api,并且在methodOne中调用get-as方法,则我希望获取/api/tasks/{taskId}作为值,而不是/api/tasks/1

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

任何帮助或指导都将不胜感激。多谢各位

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

在方法参数中,id是pathVariable。request方法在request变量中是可访问的,尽管我不知道这有什么意义,因为您将其限制为仅接受GET请求,正如@codedetector所建议的,最好的选择是如果您有request对象,或者如果您没有它,您可以添加一个

@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()
----编辑 我不知道为什么您需要这种格式的/api/tasks/{taskId}作为值而不是/api/tasks/1,但我可以考虑使用一个常量,将它用于@RequestMapping path参数,然后在获得绝对路径后,轻松地用该常量替换/附加它

String pathParam ="/{taskId}"

有没有不改变方法定义的方法?我没有请求作为我的任何控制器方法的参数。我有其他方法来处理get/post/delete/put。我想获取每个方法的路径和方法,然后获取相应调用的一些设置。@RequestMapping path=/{id},method=RequestMethod.GETmethodOne@PathVariableid一串id@sgrillon我可以访问path变量,但我想访问请求的绝对路径。即/api/tasks/{id},它通过请求映射进行映射。现在,对于请求对象,我只能获取/api/tasks/1或请求的任何任务id。我要获取配置的路径。它不返回控制器批注上配置的路径。它返回'api/tasks/1或任何id。您使用请求对象或链接生成器尝试了哪个选项?api/tasks在控制器注释中。我错过了什么?是的。我以前试过第一个,但当时正在和ControllerLinkBuilder玩。但这也给了我实际的api路径,而不是配置的路径。控制器映射为/api/tasks,方法为/{taskId}。我想获取配置的路径,即/api/tasks/{taskId}。现在,我尝试的所有东西都返回/api/tasks/1,这也是我的后备解决方案。我已经创建了helperbean来返回绝对路径。我想完全消除这样做的开销,我想知道spring是否使用某种方法将请求映射模式映射到客户端调用的url。但是这些方法在请求处理程序中是私有的。请注意,代码被读取的次数要多得多,所以使用反射不会使整个过程复杂化,甚至方法名中有一些字符串常量,那么为什么不能对{taskId}使用常量呢
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
@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(){};