接口间数据传输

9 篇文章 0 订阅

接口间数据传输问题

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

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

 java实体示例:

@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   "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 @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     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进行数据的传输和接收。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值