我是靠谱客的博主 称心寒风,这篇文章主要介绍接口间数据传输,现在分享给大家,希望可以做个参考。

接口间数据传输问题

程序的接口之间进行信息通信的过程中,会遇到一些参数数据接收和转换的问题。

例如:前端传过来的一个实体数据,其中包含另一个实体,且实体属性中包含除string以外的其他类型(例如:date),这样在接收的时候会出现各种异常情况。

 java实体示例:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Data public class Person { @FieldName("转货单据头") private Integer fid; @FieldName("发货公司系统更新时间") @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date sendUpdateSysDate; @FieldName("是否推送TMS收货公司 0否1是2预上线") private Integer tmsReceiveSwitch; @FieldName("收货公司系统更新时间") @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date ReceiveUpdateSysDate; @FieldName("转货单体") private List<Personentry> personEntryList; }

前端传递数据:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1 { 2 "fid": 0, 3 "sendUpdateSysDate": "2020-10-11 16:15:15", 4 "tmsReceiveSwitch": 0, 5 "ReceiveUpdateSysDate": "2020-10-11 16:15:15", 6 "personEntryList": [{ 7 "fid": 0, 8 "fparentid": 0, 9 "fentryid": 0, 10 "fitemid": 0}, 11 { 12 "fid": 0, 13 "fparentid": 0, 14 "fentryid": 0, 15 "fitemid": 0}, 16 ] 17 }

如上面所示,前端传递的json数据,虽然和java实体是属性一一对应但是在Controller中进行接收:

复制代码
1
2
3
4
5
6
1 @RequestMapping(value = "/api",method = RequestMethod.POST) 2 @ResponseBody 3 public RemoteResult valideTransferTime(@RequestBody Person p){ 4 logger.info(String.format(">>>>>>>>>>>>>>>>>>>>>>>入参:n[%s]",p.toString())); 5 return transferService.valideTransferTime(p); 6 }

报错如下:

出现上面的问题是由于json中字段和实体字段不对应(包括属性个数和类型)导致的。虽然Json中的字段和实体中的是一一对应的,但是在前端Json传递到后端后通过实体进行接收,实体中的Date类型,前端传过来的是字符串,导致类型不一致,无法接收。如上面代码中标红的代码。

解决方案:

方案一、通过配置解决(本人在使用方案一后仍然未解决问题):

在实体属性上使用这个两个注解中的一个,用java.util.Date;和java.sql.Date都行

@JsonFormat(pattern=“yyyy-MM-dd HH:mm:ss”, timezone=“GMT+8”)
@DateTimeFormat(pattern=“yyyy-MM-dd HH:mm:ss”)

在spring配置文件中配置

spring.jackson.date-format=yyyy-MM-dd HH:mm:ss

方案二、通过JSONObject接收,然后解析成实际使用的实体:

复制代码
1
2
3
4
5
1 public RemoteResult valideTransferTime(@RequestBody JSONObject jsonObject){ 2 Person p=JSONObject.parseObject(jsonObject.toJSONString(),Person.class); 3 logger.info(String.format(">>>>>>>>>>>>>>>>>>>>>>>入参:n[%s]",p.toString())); 4 return personService.valideTransferTime(p); 5 }

本人强烈推荐使用第二种方案,第二种方案可控度高并且问题排查比较容易,而且非常灵活。非常不推荐使用直接的实体作为DTO进行数据的传输和接收。

 

最后

以上就是称心寒风最近收集整理的关于接口间数据传输的全部内容,更多相关接口间数据传输内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部