今天工作时遇到一个场景,客户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用于数据库交互的映射。
Query
import 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;
.....
Domain
public 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;
@JsonIgnore
private int age;
}
@JsonIgnoreProperties是类注解,作用和@JsonIgnore一样
import com.fasterxml.jackson.annotation.JsonIgnore;
@JsonIgnoreProperties({“age”})
public class user {
private String name;
private int age;
}
测试就免了哦