SpringSecurity学习之路2-处理创建请求,数据校验

SpringSecurity学习之路1

在本篇中将会介绍到的内容有:@RequestBody注解、日期类型参数的处理、@Valid注解和BindingResult。先看@RequestBody注解的使用。

场景:前后端分离,后端使用Restful风格进行开发。例子,创建用户请求,并期望返回用户ID信息。下面是Controller代码:

测试代码如下:

 PS:如果这段测试代码你看不懂,请参看我的上一篇文章,或者wx联系我获取资料(联系方式在文末)。

执行测试结果:

我们看到测试执行成功,那么在controller里是否接收到了“前端”传递来的用户信息呢,看控制台输出的信息:

原因是什么呢,原因就是我们传递的是JSON格式的用户信息,所以在接收时要使用@RequestBody注解来解析请求体,并将解析结构映射到Java方法的参数

controller代码修改后如下:

执行测试后控制台输出结果:。至此,@RequestBody注解介绍结束。

 

下面看日期类型的参数处理问题。场景:User中加入birthday属性,在浏览器端以“yyyy-MM-dd HH:mm:ss”形式显示,在app中则只显示“yyyy-MM-dd”。为了应对这种业务场景,在不增加逻辑代码情况下,我们可以通过采用返回时间戳的形式来解决此问题。还是先看controller里的代码,相比之前并没有多大改动。

 测试代码:

 测试执行成功之后看到控制台打印以下信息:

至此,关于日期类型的参数处理介绍结束。在JSON格式下,我们只管返回时间戳即可,具体怎么样显示交给前端去处理。

 

接下来看关于数据校验的问题。场景:为了保证程序的正确安全运行,我们不得不加入一些校验,如非空校验、邮箱格式校验等。你可能会说,这些交给前端去处理就好了,对于不合规范的数据直接将其扼杀在摇篮中。我认为,在前后端分离中,即使前端做了相应验证,后端也应该做验证。如果有个调用API的就是没做验证呢?下面会介绍到的是@Valid注解和BindingResult。

要完成验证,我们需要在所需要验证的属性上加上相应的注解。比如我希望在创建用户时,用户名是非空的:

改写测试代码,username:null,

controller方法里的代码不变,控制台输出如下: 我们可以看到,虽然我加了@NotBlank注解,但好像并没有生效。这是因为需要我们在用到此校验的地方加上@Valid注解才可以,如下:

 测试执行,控制台输出以下信息:

我们可以看到,测试执行失败了{400}。因为没有通过@Valid校验,导致请求没有进入到方法体内。接下来看看如何处理校验失败后的信息,BindResult。改写Controller代码:

BindResult用来接收错误信息,如果有错误就将这些信息打印出来。测试代码不变,执行后控制台输出如下:

 may not be empty,不能为空。在这里并没有显示出哪一个属性为空,可以通过以下方式自定义显示详细的信息。首先更改@NotBlank注解:

更改controller代码:

测试执行成功之后控制台输出结果为: 

除了@NotBlank注解之外,org.hibernate.validator.constraints中还包含很多其他注解,如:

 

 

除了上面所提供的注解之外,我们还可以通过自定义注解来进行校验。首先创建注解接口类:

再创建一个实现此注解的逻辑类,此类必须要实现ConstraintValidator<A, T>类。A代表要实现的注解,就是上面声明的注解接口。T代表希望这个注解作用在哪些类型的属性上,如String、Object等,代码如下。 

添加使用自定义的注解:

执行测试代码,控制台输出信息如下(因为我在MyConstraintValid类中将isValid方法写死为false,所以无论输入什么都会输出age值错误):

 至此就是关于数据校验的全部介绍。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值