今天工作時遇到一個場景,客戶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配置文件:
<resultMap id="TywCommonInfo" type="com.ky.rest.yw.model.domain.TywCommonInfo">
<result property="ywCommonInfoId" column="YW_COMMON_INFO_ID" />
<result property="workOrderNo" column="WORK_ORDER_NO" />
<result property="workOrderType" column="WORK_ORDER_TYPE" />
<result property="servOperType" column="SERV_OPER_TYPE" />
<result property="customerId" column="CUSTOMER_ID" />
<result property="customerName" column="CUSTOMER_NAME" />
<result property="customerAddress" column="CUSTOMER_ADDRESS" />
<result property="orderNumber" column="ORDER_NUMBER" />
<result property="orderType" column="ORDER_TYPE" />
<result property="businessType" column="BUSINESS_TYPE" />
....
可以看到customerID與我們數據庫中的字段customerId、javaBean字段customerId 不一致,這只是報文協議的冰山一角,需要通過相關手段讓customerID的值“綁定”到customerId上。
這時候就需要@JSONField註解,它可以作用在成員屬性上或者在方法上。下面通過實例驗證一下如何使用。
1、首先是配置在成員屬性上
我的實體類分爲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。
2、註解在成員方法上面
@JSONField(name = "customerID")
public String getCustomerID() {
return customerId;
}
@JSONField(name = "customerID")
public void setCustomerID(String customerId) {
this.customerId = customerId;
}
還是得注意是getCustomerID不是getCustomerI。其餘不變,測試就免了,親測可用。
@JsonIgnore和@JsonIgnoreProperties
@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;
}
測試就免了哦