第一次写文章,很多东西总是忘记,还是写写
需求
因为项目改造,对前后端请求 要加上固定参数内容
// A请求
{
// 每个请求都要有fixedData
fixedData:{
xx: "xxx",
yy: "xxx"
}
// body才是这个请求的数据
body: {
aa: ""
}
}
// B请求
{
fixedData:{
xx: "xxx",
yy: "xxx"
}
body: {
bb: ""
}
}
这样一来后端就麻烦了,body
的内容是原先一整个请求的参数,有对象映射
public class AReq {
private String aa;
}
public class BReq {
private String bb;
}
现在要加上fixedData
,每个请求对象都得改,改动比较多
public class NewAReq {
private FixedData fixedData;
private AReq body;
}
public class NewBReq {
private FixedData fixedData;
private BReq body;
}
改进
记录下过程,可以直接略过里看后面泛型
最开始想法就是定义一个公共的请求,以请求A为例
public class CommonReq {
private FixedData fixedData;
private Object body;
}
原先的controller
@PostMapping("/rr")
public void rr(@RequestBody AReq req){
return AService.dd(req);
}
修改后
@PostMapping("/rr")
public void rr(@RequestBody CommonReq req){
AReq aReq = (AReq) req.getBody();
return AService.dd(req);
}
运行发现这种方式并不行,无法将req.getBody()
强制转换为AReq
,因为req.getBody()
是Map
然后又想到前端将body参数
转为string
,(或者把req.getBody()
序列化,还没试过),再反序列化
@Autowired
private ObjectMapper objectMapper;
@PostMapping("/rr")
public void rr(@RequestBody CommonReq req) throws XxxException{
AReq aReq = objectMapper.readValue((String)req.getBody(),AReq.class);
return AService.dd(req);
}
这种方式倒是可以实现,但是在代码里转来转去,还是比较费工夫
使用泛型改造
突发奇想试一下Java泛型,把body的内容用泛型表示
public class CommonReq<R> {
private FixedData fixedData;
private R body;
}
这样的话,原先A请求就变为Common<AReq>
,B请求就对应Common<BReq>
,不用再一个个写新对象或改造原有对象,controller的修改也变得简单
@PostMapping("/rr")
public void rr(@RequestBody CommonReq<AReq> req){
return AService.dd(req.getBody());
}