一 、@PathVariable

1、定义URL变量规则

可以在@RequestMapping注解中用{}来表明它的变量部分,例如:

@RequestMapping("/users/{username}")

这里{username}就是我们定义的变量规则,username是变量的名字,那么这个URL路由可以匹配下列任意URL并进行处理:

  • /users/tianmaying
  • /users/ricky
  • users/tmy1234

需要注意的是,在默认情况下,变量中不可以包含URL的分隔符/,例如路由不能匹配/users/tianmaying/ricky,即使你认为tianmaying/ricky是一个存在的用户名。

2、获取URL变量

在路由中定义变量规则后,通常我们需要在处理方法(也就是@RequestMapping注解的方法)中获取这个URL的具体值,并根据这个值(例如用户名)做相应的操作,SpringMVC提供的@PathVariable可以帮助我们:

@RequestMapping("/users/{username}")
    @ResponseBody
    public String userProfile(@PathVariable String username){
//        return String.format("user %s", username);
        return "user" + username; 
    }

在上述例子中,当@Controller处理HTTP请求时,userProfile的参数username会自动设置为URL中对应变量username(同名赋值)的值,例如当HTTP请求为/users/fpc

,URL变量username的值fpc会被赋给函数参数username,函数的返回值自然是userfpc。

在默认的情况下,Spring会对@PathVariable注解的变量进行自动赋值,当然你也可以指定@PathVariable使用哪一个URL中的变量:

@RequestMapping("/users/{username}")
    @ResponseBody
    public String userProfile(@PathVariable("username") String username){
//        return String.format("user %s", username);
        return "user" + username; 
    }

运行结果:

springboot PathVariable可以接数组吗 spring @pathvariable_赋值

springboot PathVariable可以接数组吗 spring @pathvariable_实体类_02

3、定义多个URL变量

可以定义URL路由,其中包含多个URL变量:

@RequestMapping("/user/{username}/blog/{blogId}")
    @ResponseBody
    public String getUerBlog(@PathVariable String username , @PathVariable int blogId) {
        return "user: " + username + "blog->" + blogId;
    }

这种情况下,Spring能够根据名字自动赋值对应的函数参数值,当然也可以在@PathVariable中显示地表明具体的URL变量值。

在默认情况下,@PathVariable注解的参数可以是一些基本的简单类型:int,long,Date,String等,Spring能根据URL变量的具体值以及函数参数的类型来进行转换,例如/user/fpc/blog/1,会将“fpc”的值赋给username,而1赋值给int变量blogId。

运行结果:

springboot PathVariable可以接数组吗 spring @pathvariable_赋值_03

4、匹配正则表达式

很多时候,需要对URL变量进行更加精确的定义,例如-用户名只可能包含小写字母,数字,下划线,我们希望:

  • /user/fpc是一个合法的URL
  • /user/#$$$则不是一个合法的URL

除了简单地定义{username}变量,还可以定义正则表达式进行更精确的控制,定义语法是{变量名:正则表达式}[a-zA-Z0-9_]+是一个正则表达式,表示只能包含小写字母,大写字母,数字,下划线。如此设置URL变量规则后,不合法的URL则不会被处理,直接由SpringMVC框架返回404Not Found。

@RequestMapping("/user/{username:[a-zA-Z0-9_]+}/blog/{blogId}")

 

5、总结

  • 在@RequestMapping注解中定义URL变量规则
  • 在@RequestMapping注解方法中获取URL变量-@PathVariable
  • @PathVariable指定URL变量名
  • 定义多个URL变量
  • 用正则表达式精确定义URL变量

二、@Valid注解

@Valid注解可以实现数据的验证,你可以定义实体,在实体的属性上添加校验规则,而在API接收数据时添加@valid关键字,这时你的实体将会开启一个校验的功能。

@Valid 注解类型的使用:

@Null
限制只能为null

@NotNull
限制必须不为null

@AssertFalse
限制必须为false

@AssertTrue
限制必须为true

@DecimalMax(value)
限制必须为一个不大于指定值的数字

@DecimalMin(value)
限制必须为一个不小于指定值的数字

@Digits(integer,fraction)
限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction

@Future
限制必须是一个将来的日期

@Max(value)
限制必须为一个不大于指定值的数字

@Min(value)
限制必须为一个不小于指定值的数字

@Past
限制必须是一个过去的日期

@Pattern(value)
限制必须符合指定的正则表达式

@Size(max,min)
限制字符长度必须在min到max之间

@Past
验证注解的元素值(日期类型)比当前时间早

@NotEmpty
验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)

@NotBlank
验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格

@Email
验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式

注意,不要错用了异常类型,比如在int上不可用@size

springboot PathVariable可以接数组吗 spring @pathvariable_实体类_04

讲一下普通实体字段验证及嵌套实体字段验证区别

springboot PathVariable可以接数组吗 spring @pathvariable_赋值_05

springboot PathVariable可以接数组吗 spring @pathvariable_实体类_06

注意:实体类验证只是针对该实体内第一层对象的属性进行验证,如果存在被验证的实体类为另一个实体类的的成员变量,那么就需要在该成员变量(需要验证的实体类)上加 @valid 注解。

另:

springboot PathVariable可以接数组吗 spring @pathvariable_实体类_07

 

 参考文章:http://blog.51cto.com/825272560/2121519