springboot传值踩坑
由于我现在写的项⽬都是前后端分离的,前端⽤的是vue,后端springboot,于是前后端传值的问题就是⼀个⽐较重要的问题,为此我还特意去学了⼀下vue的传值,其实就是⽤⼀个axios组件,其实就是基于promise对ajax的封装,⽤法和ajax⼏乎⼀样,有兴趣的可以学学vue;
⼀般⽽⾔这种前后端分离的情况,前后端数据交互⽤的是json传递,⽽在spring中已经有两个注解定义好了,可以直接使⽤
@RequestBody和@ResponseBody;
温馨提⽰,以下代码默认你已经会使⽤swagger框架,lombok注解
1. RequestBody注解
看名字这个注解就是和请求有关的,⽽事实也确实如此,@RequestBody注解的作⽤是将前端传过来的json字符串转换成java对象,⽤法如下:
你们可以不⽤实现InitializingBean,这个接⼝是我测试其他东西⽤到的
@RestController
@Api(value="测试校验注解controller",tags="测试校验注解controller")
@Slf4j
public class TestController implements InitializingBean{
// 测试数据库数据
@PostMapping("/hello")
@ApiOperation(value = "传⼊对象校验", notes = "传⼊对象校验")
public User hello(@RequestBody @Valid User user) {
System.out.println(user);
return user;
}
}
@Data
@Accessors(chain=true)
public class User {
@NotBlank
@Size(max=3,message="名字最多只能是3位")
private String name;
@NotBlank
private String age;
}
相信⼤家对上⾯代码很熟悉了,其中在⽅法hello⽅法的参数中,我们⽤了@RequestBody注解修饰user对象,这个时候从前端传过来的json字符串就被映射到user中,我顺便⽤了⼀下@Valid注解校验传值是否⾮空,我们可以⽤这个很简单的判断user对象有没有接收到;
打开swagger的ui界⾯,就是项⽬启动的 ip:端⼝/swagger-ui.html
然后点击try it out,可以看到结果:
后端也收到了数据:
到这⾥⼀切是如此美好,然后突然有的时候前端抽风或者是当你接收⼀些奇葩项⽬的时候,前端传值⾸字母⼤写,你会怎么样?有⼈说这很简单啊,我只需要把后端对应的User中对应的字段也改⼀下啊,我们看看结果:
测试结果如下,这⾥我有个校验的全局异常处理器做了处理;这个时候说明后端Name字段接收数据失败,这是个⼤坑,项⽬中把我坑了好半天。。
解决办法⼀:让前端变量命名⽤驼峰,即⾸字母⼩写,那么后端字段只需要跟前端⼀样就可以了;
spring boot选择题 解决办法⼆:后端在接收变量的该字段中添加注解:
测试结果:
2. ResponseBody注解
顺便讲⼀下这个注解,这个注解顾名思义,就是将java对象以⾃动转化为json字符串的形式返回给前端,我们可以在每⼀个⽅法上加⼀个这个注解,但是常⽤的做法就是在Controller上使⽤RestController注解,那么我们直接在⽅法中返回对象就好了,不⽤⼿动的转成json然后再传
其实这两个注解@RequestBody和@ResponseBody 原理上都差不多,其实很简单,⽤到⼀个转换器HttpMessageConverter ,将Http 请求体中的json取到,然后⽤开源的Jason进⾏转换成java对象,后⾯有时间可以分析⼀下源码
反思
由于现在⼤多都是前后端分离的,虽然使得后端程序员不需要再去关注页⾯的逻辑了,这也极⼤的减轻了后端的压⼒,将压⼒前移了,但是这也造成了⼀些问题,就是前后端要进⾏频繁的联调,这也说明了接⼝⽂档的重要性,项⽬初期定义好接⼝⽂档真的可以省下很多功夫,避免后期频繁调整;
其实吧,有时间学⼀下前端的内容还是很有意思的,最近在学vue,才知道es6。。(҂ ˘ _ ˘ ),不过⽤es6很舒服,类似java中类的⽤法 还有就是字段的命名规则,求求你了,⽤驼峰吧!!!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论