Spring根据URL参数进行路由的方法详解

前言

本文主要介绍了关于Spring根据URL参数进行路由的相关内容,分享出来供大家参考学习价值,下面来一起看看详细的介绍吧。

发现问题

最近在写接口的时候发现一个问题,就是两个REST接口的URL的path部分是一样的,根据query传入不同的参数来区分。

比如S3普通上传接口是是:

PUT /{bucketname}/{ objectname}

分块上传的接口是:

PUT /{bucketname}/{objectname}?partNumber={partNumber}&uploadId={uploadId}

传入partNumber和uploadId是一个接口,没有传入这两个参数是另外一个接口,那Spring中要如何进行路由设置呢?

一般我们设置路由都是@RequestMapping(value = "/xx", method = RequestMethod.GET) 。然后在方法签名中可以通过@RequestParam注入参数。

但是直接通过注入不同的参数来实现区分是不行的,比如:

@ResponseBody
@RequestMapping(value = "/xx", method = RequestMethod.GET)
public String get1(){
 return "get1";
}
@ResponseBody
@RequestMapping(value = "/xx", method = RequestMethod.GET)
public String get2(@RequestParam name){
 return "get2" + name;
}

这样会报错:

java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'DemoController_v01' method
public java.lang.String com.nd.sdp.ndss.controller.v01.DemoController.get1()
to {[/demo/xx],methods=[GET]}: There is already 'DemoController_v01' bean method

解决方法

意思是重复注册了,所以@RequestParam是不能用来作为路由依据的。

@RequestParam

用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容。(Http协议中,如果不指定Content-Type,则默认传递的参数就是application/x-www-form-urlencoded类型)

RequestParam可以接受简单类型的属性,也可以接受对象类型。

实质是将Request.getParameter() 中的Key-Value参数Map利用Spring的转化机制ConversionService配置,转化成参数接收对象或字段。

@RequestMapping作为路由注解,除了常用的value字段用于设置url外,还提供了params参数,可以指定如何匹配url中query的参数。又几种配置方法:

  • myParam=myValue匹配有myParam参数,并且等于myValue的url
  • myParam!=myValue匹配有myParam参数,并且不等于myValue的url
  • myParam匹配有myParam参数的url
  • !myParam匹配没有myParam参数的url

这样就可以很灵活的指定路由了。

而且@RequestMapping还提供了headers参数,可以让我们根据Header的情况进行路由!

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

您可能感兴趣的文章:

  • Spring MVC 学习 之 - URL参数传递详解
  • Spring MVC url提交参数和获取参数
  • 使用Spring自定义注解实现任务路由的方法
(0)

相关推荐

  • Spring MVC 学习 之 - URL参数传递详解

    在学习 Spring Mvc 过程中,有必要来先了解几个关键参数: @Controller: 在类上注解,则此类将编程一个控制器,在项目启动 Spring 将自动扫描此类,并进行对应URL路由映射. @Controller public class UserAction{ } @RequestMapping 指定URL映射路径,如果在控制器上配置 RequestMapping  ,具体请求方法也配置路径则映射的路径为两者路径的叠加 常用映射如:RequestMapping("url.html&q

  • 使用Spring自定义注解实现任务路由的方法

    在Spring mvc的开发中,我们可以通过RequestMapping来配,当前方法用于处理哪一个URL的请求.同样我们现在有一个需求,有一个任务调度器,可以按照不同的任务类型路由到不同的任务执行器.其本质就是通过外部参数进行一次路由和Spring mvc做的事情类似.简单看了Spring mvc的实现原理之后,决定使用自定义注解的方式来实现以上功能. 自定义TaskHandler注解 @Target({ElementType.TYPE}) @Retention(RetentionPolicy

  • Spring MVC url提交参数和获取参数

    普通URL提交参数 该格式url为:url.do?param1=mahc&param2=8888.00 需要在上文中的HelloController对象添加方法如下: /** * Spring MVC URL提交参数 * @param name * @return */ @RequestMapping("/param") public ModelAndView getInfo(@RequestParam("name") String name){ Strin

  • Spring根据URL参数进行路由的方法详解

    前言 本文主要介绍了关于Spring根据URL参数进行路由的相关内容,分享出来供大家参考学习价值,下面来一起看看详细的介绍吧. 发现问题 最近在写接口的时候发现一个问题,就是两个REST接口的URL的path部分是一样的,根据query传入不同的参数来区分. 比如S3普通上传接口是是: PUT /{bucketname}/{ objectname} 分块上传的接口是: PUT /{bucketname}/{objectname}?partNumber={partNumber}&uploadId=

  • Go语言HttpRouter路由使用方法详解

    HttpRouter是一个轻量级但却非常高效的multiplexer.手册: https://godoc.org/github.com/julienschmidt/httprouter https://github.com/julienschmidt/httprouter 用法示例 package main import ( "fmt" "github.com/julienschmidt/httprouter" "net/http" "

  • Spring Security实现接口放通的方法详解

    目录 1.SpringBoot版本 2.实现思路 3.实现过程 3.1新建注解 3.2新建请求枚举类 3.3判断Controller方法上是否存在该注解 3.4在SecurityConfig上进行策略的配置 3.5在Controller方法上应用 3.6效果展示 在用Spring Security项目开发中,有时候需要放通某一个接口时,我们需要在配置中把接口地址配置上,这样做有时候显得麻烦,而且不够优雅.我们能不能通过一个注解的方式,在需要放通的接口上加上该注解,这样接口就能放通了.答案肯定是可

  • Spring零基础到进阶之使用方法详解

    目录 一.Spring的创建和使用 1.创建一个Maven项目 2.添加Spring框架支持 3.添加启动类 二.存储Bean 1.添加配置文件(非第一次省略此步) 2.创建Bean对象 2.1.创建Bean对象 2.2.将Bean对象注入到Spring中 三.获取并使用 Bean 对象 1.先得到Spring上下文对象 2.再通过上下文提供的方法获取到Bean对象 3.使用Bean对象 今天介绍一下Spring的基本使用,为了更好的熟悉Spring,可以先看一下我前面的文章: Spring鸿蒙

  • C++中可以接受任意多个参数的函数定义方法(详解)

    能够接受任意多个参数的函数,可以利用重载来实现.这种函数的执行过程类似于递归调用,所以必须要有递归终止条件. #include <iostream> #include <bitset> void print() {} // 递归终止条件.这是必需的. template<typename Type, typename... Types> void print(const Type& arg, const Types&... args) { std::cou

  • python解析命令行参数的三种方法详解

    这篇文章主要介绍了python解析命令行参数的三种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 python解析命令行参数主要有三种方法:sys.argv.argparse解析.getopt解析 方法一:sys.argv -- 命令行执行:python test_命令行传参.py 1,2,3 1000 # test_命令行传参.py import sys def para_input(): print(len(sys.argv)) #

  • Python实现解析参数的三种方法详解

    目录 先决条件 使用 argparse 使用 JSON 文件 使用 YAML 文件 最后的想法 今天我们分享的主要目的就是通过在 Python 中使用命令行和配置文件来提高代码的效率 Let's go! 我们以机器学习当中的调参过程来进行实践,有三种方式可供选择.第一个选项是使用 argparse,它是一个流行的 Python 模块,专门用于命令行解析:另一种方法是读取 JSON 文件,我们可以在其中放置所有超参数:第三种也是鲜为人知的方法是使用 YAML 文件!好奇吗,让我们开始吧! 先决条件

  • Java Spring Controller 获取请求参数的几种方法详解

    Java Spring Controller 获取请求参数的几种方法  1.直接把表单的参数写在Controller相应的方法的形参中,适用于get方式提交,不适用于post方式提交.若"Content-Type"="application/x-www-form-urlencoded",可用post提交 url形式:http://localhost:8080/SSMDemo/demo/addUser1?username=lixiaoxi&password=1

  • Python 中urls.py:URL dispatcher(路由配置文件)详解

    urls.py:URL dispatcher(路由配置文件) URL配置(URLconf)就像是Django所支撑网站的目录.它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表.以这样的方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码.url的加载就是从配置文件中开始. urlpatterns的两种形式 没有前缀的情况,使用的列表(推荐方式) URL模式 urlpatterns = [ url(正则表达式, view函数, 参数, 别名, 前缀), ]

  • Laravel框架创建路由的方法详解

    本文实例讲述了Laravel框架创建路由的方法.分享给大家供大家参考,具体如下: 我这里使用的Laravel版本是5.6,路由位置在routes/web.php中,所以我们在这个文件中添加我们想要添加的路由. 1.基础路由 //get请求,结果如下图 Route::get('basic1',function (){ return 'Hello World'; }); //post请求,这里不展示结果图 Route::post('basic2',function (){ return 'Post'

随机推荐