本文共 4671 字,大约阅读时间需要 15 分钟。
今天工作时遇到一个场景,客户A跟我们进行restful + json数据交互,我们(B,充当中间层的一个角色)将数据存储,并将获取的数据直接与客户C进行restful交互,里面涉及到一些javaBean属性的大小写映射以及某些字段的忽略,现在对相关的注解进行一些说明。
客户A提供的数据格式如下:
{ "workOrderNo": "0205258", "workOrderType": "", "servOperType": "create", "customerID": "bbb1", "customerName": "xxx", "customerAddress": "xxx", "orderNumber": "aaa", "orderType": "", "businessType": "sijfniods" }
我们的数据库设计:
JavaBean: /** 主键 */ private Long ywCommonInfoId; /** 工单编码 */ private String workOrderNo; /** 工单类型 */ private String workOrderType; /** 操作类型 */ private String servOperType; /** 客户ID */ private String customerId; /** 客户名称 */ private String customerName; /** 客户地址 */ private String customerAddress; /** 订单号码 */ private String orderNumber; /** 订单类型 */ ...................数据库: CREATE TABLE `T_YW_COMMON_INFO` ( `YW_COMMON_INFO_ID` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', `WORK_ORDER_NO` varchar(255) DEFAULT NULL COMMENT '工单编码', `WORK_ORDER_TYPE` varchar(255) DEFAULT NULL COMMENT '工单类型', `SERV_OPER_TYPE` varchar(255) DEFAULT NULL COMMENT '操作类型', `CUSTOMER_ID` varchar(255) DEFAULT NULL COMMENT '客户ID', `CUSTOMER_NAME` varchar(255) DEFAULT NULL COMMENT '客户名称', `CUSTOMER_ADDRESS` varchar(255) DEFAULT NULL COMMENT '客户地址', `ORDER_NUMBER` varchar(255) DEFAULT NULL COMMENT '订单号码', `ORDER_TYPE` varchar(255) DEFAULT NULL COMMENT '订单类型',....mybatis的xml配置文件:....
可以看到customerID与我们数据库中的字段customerId、javaBean字段customerId 不一致,这只是报文协议的冰山一角,需要通过相关手段让customerID的值“绑定”到customerId上。
这时候就需要@JSONField注解,它可以作用在成员属性上或者在方法上。下面通过实例验证一下如何使用。
我的实体类分为Query和Domain,本质差别不大,只是Query用于接收参数,domain用于数据库交互的映射。
Queryimport com.alibaba.fastjson.annotation.JSONField;public class TywCommonInfoQuery extends BaseQuery implements Serializable{private static final long serialVersionUID = 7330604473414315543L; /** 主键 */ private Long ywCommonInfoId; /** 工单编码 */ private String workOrderNo; /** 工单类型 */ private String workOrderType; /** 操作类型 */ private String servOperType; /** 客户ID */ @JSONField(name = "customerID") private String customerId; /** 客户名称 */ private String customerName;.....Domainpublic class TywCommonInfo extends BaseEntity implements Serializable { private static final long serialVersionUID = 1L; /** * 主键 db_column: YW_COMMON_INFO_ID */ private Long ywCommonInfoId; /** * 工单编码 db_column: WORK_ORDER_NO */ private String workOrderNo; /** * 工单类型 db_column: WORK_ORDER_TYPE */ private String workOrderType; /** * 操作类型 db_column: SERV_OPER_TYPE */ private String servOperType; /** * 客户ID db_column: CUSTOMER_ID */ @JSONField(name = "customerID") private String customerId; /** * 客户名称 db_column: CUSTOMER_NAME */ private String customerName; /** * 客户地址 db_column: CUSTOMER_ADDRESS */ private String customerAddress; /** * 订单号码 db_column: ORDER_NUMBER */ private String orderNumber; /** * 订单类型 db_column: ORDER_TYPE ......
如果你以为这样就完事了,那就入坑了,需要对get/set方法重新书写:
..... public String getCustomerID() { return customerId; } public void setCustomerID(String customerId) { this.customerId = customerId; }.......
看到了吧,getCustomerID 而不是 getCustomerId!set方法也是一样的。
上一段测试代码
@ResponseBody @PostMapping("/create") public Response create(HttpServletRequest req, @RequestBody TywCommonInfoQuery query) { TywCommonInfo t = null; try { t = new TywCommonInfo(); BeanUtils.copyProperties(t, query); t.setCreateTime(new Date()); tywCommonInfoService.save(t); LOG.info("__" + query.toString()); } catch (Exception e) { LOG.error("",e); } return Response.success(SUCCESS, "", t); }
利用postman测试工具,查看结果
可以看到"customerID"的值被 TywCommonInfoQuery 的 customerId的属性获取了,同时通过 beanutils工具类把值传给了TywCommonInfo的customerId。因为postman返回的是TywCommonInfo,不是TywCommonInfoQuery。而且,响应返回的是customerID,是大写的。
再来看数据库,可以看到CUSTOMER_ID是有字段值的,第一行null是没用注解插入的,所以是null。
@JSONField(name = "customerID") public String getCustomerID() { return customerId; } @JSONField(name = "customerID") public void setCustomerID(String customerId) { this.customerId = customerId; }
还是得注意是getCustomerID不是getCustomerI。其余不变,测试就免了,亲测可用。
@JsonIgnore此注解用于属性或者方法上,常用在属性上,作用是json序列化时将Java bean中的一些属性忽略掉,序列化和反序列化都受影响。
例如生成Json时不需要age属性
import com.fasterxml.jackson.annotation.JsonIgnore;public class user {private String name;@JsonIgnoreprivate int age;}
@JsonIgnoreProperties是类注解,作用和@JsonIgnore一样
import com.fasterxml.jackson.annotation.JsonIgnore;@JsonIgnoreProperties({“age”})public class user {private String name;private int age;}
测试就免了哦
转载地址:http://sgrdb.baihongyu.com/