1.æ¦è¿°
è¿æ¥æ们é½å¨å´ç»ç使ç¨Spring Bootå¼åä¸å¡ç³»ç»æ¶å¦ä½ä¿è¯æ°æ®å®å ¨æ§è¿ä¸ªä¸»é¢å±å¼æ»ç»ï¼å½ä¸å¤§é¨åçB/Sæ¶æçç³»ç»ä¹é½æ¯åºäºSpring Boot + SpringMVCä¸å±æ¶æå¼åçï¼å¯ä»¥è®¤ä¸ºæ¯å¨SpringMVCçä¸å±æ¶æä¸çcontrollerå±(é»è¾æ§å¶å±)对æ¥å£æ°æ®è¿è¡å®å ¨å¤çæä½ï¼æ´ç´æ¥ç¹è¯´å°±æ¯å¨æ¥å£è¯·æ±åæ°ä¼ å ¥è¿è¡é»è¾å¤çæè ååºåæ°è¾åºå°é¡µé¢å±ç¤ºä¹åè¿è¡æ°æ®å¤ççï¼æ以åªæ¯å¨SpringMVCä¸å±æ¶æä¸çä¸å±ä¸è¿è¡å®å ¨å åºï¼è¿ä¸æ¯å¾ç¨³åºï¼æ¥ä¸æ¥ä»å¤©æ们就åæ¥è®²è®²å¨SpringMVCä¸å±æ¶æå¦ä¸å±ä¸å¦ä½è¿è¡æ°æ®å®å ¨å åºï¼å¨è¿å ¥ä»å¤©ä¸»é¢ä¹åå æ¥ççä»ä¹æ¯SpringMVCæ¶æï¼
ä»ä¹æ¯SpringMVCä¸å±æ¶æï¼
SpringMVCçå·¥ç¨ç»æä¸è¬æ¥è¯´å为ä¸å±ï¼èªä¸èä¸æ¯Modleå±ï¼æ¨¡åï¼æ°æ®è®¿é®å±ï¼ãCotrollerå±ï¼æ§å¶ï¼é»è¾æ§å¶å±ï¼ãViewå±ï¼è§å¾ï¼é¡µé¢æ¾ç¤ºå±ï¼ï¼å ¶ä¸Modleå±å为两å±ï¼daoå±ãserviceå±ï¼MVCæ¶æåå±ç主è¦ä½ç¨æ¯è§£è¦ãéç¨åå±æ¶æç好å¤ï¼æ®éæ¥åçæ¯ç³»ç»åå±æå©äºç³»ç»çç»´æ¤ï¼ç³»ç»çæ©å±ãå°±æ¯å¢å¼ºç³»ç»çå¯ç»´æ¤æ§åå¯æ©å±æ§ã对äºSpringè¿æ ·çæ¡æ¶ï¼ï¼View\Webï¼è¡¨ç¤ºå±è°ç¨æ§å¶å±ï¼Controllerï¼ï¼æ§å¶å±è°ç¨ä¸å¡å±ï¼Serviceï¼ï¼ä¸å¡å±è°ç¨æ°æ®è®¿é®å±ï¼Daoï¼ å¯ä»¥è¿ä¹è¯´ï¼ç°å¨90%以ä¸çä¸å¡ç³»ç»é½æ¯åºäºè¯¥ä¸å±æ¶æ模å¼å¼åçï¼è¿ç§æ¶æ模å¼ä¹æ人说æ¯è®¾è®¡æ¨¡å¼ä¸ä¸ç§ï¼å¯è§å ¶éè¦æ§ä¸è¨èå»ï¼æ以æ们ééè§ã
æ们ä¹é½ç¥éå¨æ¥å¸¸å¼åç³»ç»è¿ç¨ä¸ï¼æ°æ®å®å ¨æ¯é常éè¦çãç¹å«æ¯å¨å½ä»äºèç½æ¶ä»£ï¼ä¸ªäººéç§å®å ¨æå ¶éè¦ï¼ä¸æ¦ä¸ªäººç¨æ·æ°æ®éå°æ»å»æ³é²ï¼å°ä¼é æç¾é¾çº§çäºæ é®é¢ãææä¹åæ们åºäºæ¥å£å±è¿è¡æ°æ®å®å ¨å¤çæ¯è¿è¿ä¸å¤çï¼ä»å¤©æ们就æ¥è°è°å¦ä½Modelå±(æ°æ®è®¿é®å±)ææ ·åå°ä¼é æ°æ®å å¯åå¨ã模ç³å¹é åå ¶è±æå±ç¤ºï¼æ¬æç主é¢ï¼æ°æ®å å¯åå¨ã模ç³å¹é åè±æå±ç¤ºã
é¶è¡ç³»ç»å¯¹æ°æ®å®å ¨æ§çè¦æ±å¨ä¸å¡ç³»ç»ä¸æ¯é¦å±ä¸æçï¼æ以ä»å¤©æ们就以常è§ç个人é¶è¡è´¦æ·æ°æ®ï¼å¯ç ãææºå·ã详ç»å°åãé¶è¡å¡å·çä¿¡æ¯å段为ä¾ï¼è¿è¡ä¸»é¢ç宣讲ä¸æµ æã
项ç®æ¨èï¼åºäºSpringBoot2.xãSpringCloudåSpringCloudAlibabaä¼ä¸çº§ç³»ç»æ¶æåºå±æ¡æ¶å°è£ ï¼è§£å³ä¸å¡å¼åæ¶å¸¸è§çéåè½æ§éæ±ï¼é²æ¢éå¤é è½®åï¼æ¹ä¾¿ä¸å¡å¿«éå¼ååä¼ä¸ææ¯æ æ¡æ¶ç»ä¸ç®¡çãå¼å ¥ç»ä»¶åçææ³å®ç°é«å èä½è¦å并ä¸é«åº¦å¯é ç½®åï¼åå°å¯ææãä¸¥æ ¼æ§å¶å ä¾èµåç»ä¸çæ¬ç®¡çï¼åå°æå°åä¾èµã注é代ç è§èå注éï¼é常éå个人å¦ä¹ åä¼ä¸ä½¿ç¨
Githubå°åï¼github.com/plasticene/â¦
Giteeå°åï¼gitee.com/plasticene3â¦
2.æ°æ®å å¯åå¨
æ们ä¹åæ»ç»çæ¯å¨æ¥å£å±è¿è¡æ°æ®å 解å¯ä¼ è¾ï¼ä¹å¼ºè°è¿è¿ç§æ¹å¼ä¿è¯ä¸äºæ°æ®çç»å¯¹å®å ¨ï¼åªæ¯æææé«æ¥å£æ°æ®å®å ¨æ§ï¼æ¬é«æ°æ®è¢«æåçé¨æ§èå·²ãæ以æ¥ä¸æ¥æ们就æ¥è®²è¿°ä¸ä¸å¦ä½å¨æ°æ®çæºå¤´åå¨å±ä¿éå ¶å®å ¨ãæ们é½ç¥éä¸äºæ ¸å¿ç§å¯å段ï¼æ¯å¦è¯´å¯ç ï¼ææºå·çå¨æ°æ®åºå±åå¨å°±ä¸è½ææåå¨ï¼å¿ é¡»å å¯åå¨ä¿è¯å³ä½¿æ°æ®åºæ³é²äºä¹ä¸ä¼è½»ææå æ°æ®ã
2.1 ä¼é å®ç°æ°æ®åºå段å 解å¯åç
Mybatis-plusæä¾ä¼ä¸é«çº§ç¹æ§å°±ææ¯ææ°æ®å å¯è§£å¯ï¼ä¸è¿æ¯æ¶è´¹çãããä½æ¯æ们å¯ä»¥ç»ç»æ¢ç©¶å ¶åçè¿è¡åè½çèªæå®ç°ã
å ¶å®å¨æ们ä¸é¢æ¨èçå¿«éå¼åæ¡æ¶ä¸å°±å·²ç»ä¼é æ´åäºæ°æ®å 解å¯åè½äºï¼EncryptTypeHandlerï¼å®ç°æ°æ®åºçå段å å¯ä¸è§£å¯ã
é»è®¤æä¾äºåºäºbase64å å¯ç®æ³Base64EncryptServiceåAESå å¯ç®æ³AESEncryptServiceï¼å½ç¶ä¸å¡ä¾§ä¹å¯ä»¥èªå®ä¹å å¯ç®æ³ï¼è¿éè¦å®ç°æ¥å£EncryptServiceï¼å¹¶æå®ç°ç±»æ³¨å ¥å°å®¹å¨ä¸å³å¯ãå å¯åè½æ ¸å¿é»è¾
@Bean
@ConditionalOnMissingBean(EncryptService.class)
public EncryptService encryptService() {
Algorithm algorithm = encryptProperties.getAlgorithm();
EncryptService encryptService;
switch (algorithm) {
case BASE64:
encryptService = new Base64EncryptService();
break;
case AES:
encryptService = new AESEncryptService();
break;
default:
encryptService = null;
}
return encryptService;
}
æ¥ä¸æ¥å°±å¯ä»¥åºäºå å¯ç®æ³ï¼æ©å±mybatisçtypeHandler对å®ä½å段æ°æ®è¿è¡å å¯è§£å¯äºï¼EncryptTypeHandler
public class EncryptTypeHandler<T> extends BaseTypeHandler<T> {
@Resource
private EncryptService encryptService;
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, encryptService.encrypt((String)parameter));
}
@Override
public T getNullableResult(ResultSet rs, String columnName) throws SQLException {
String columnValue = rs.getString(columnName);
return StrUtil.isBlank(columnValue) ? (T)columnValue : (T)encryptService.decrypt(columnValue);
}
@Override
public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String columnValue = rs.getString(columnIndex);
return StrUtil.isBlank(columnValue) ? (T)columnValue : (T)encryptService.decrypt(columnValue);
}
@Override
public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
String columnValue = cs.getString(columnIndex);
return StrUtil.isBlank(columnValue) ? (T)columnValue : (T)encryptService.decrypt(columnValue);
}
}
2.2 å å¯ä¸è§£å¯ç¤ºä¾
é¦å å建ä¸å¼ user表ï¼
CREATE TABLE `user` (
`id` bigint(20) NOT NULL,
`name` varchar(255) DEFAULT NULL COMMENT 'å§å',
`phone` varchar(255) DEFAULT NULL COMMENT 'ææºå·',
`id_card` varchar(255) DEFAULT NULL COMMENT '身份è¯å·',
`bank_card` varchar(255) DEFAULT NULL COMMENT 'é¶è¡å¡å·',
`address` varchar(255) DEFAULT NULL COMMENT 'ä½å',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
è¿æ¶åæ们æ£å¸¸æå ¥ä¸æ¡æ°æ®ï¼
@Test
public void test() {
User user = new User();
user.setName("shepherd");
user.setMobile("17812345678");
user.setIdCard("213238199601182111");
user.setBankCard("3222022046741500");
user.setAddress("æå·å¸ä½æåºæªæ¥ç§æå");
userDAO.insert(user);
}
æ°æ®åºåå¨æ¥è¯¢ç»æå¦ä¸ï¼
id | name | mobile | id_card | bank_card | address |
1567402046481436673 | shepherd | 17812345678 | 213238199601182111 | 3222022046741500 | æå·å¸ä½æåºæªæ¥ç§æå |
è¿å°±æ¯æ们平æ¶ä¸å å¯åå¨æ¥è¯¢çç»æï¼è¿éidæ¯éè¿åå¸å¼idç®æ³èªå¨çæçåã
æ¥ä¸æ¥æ们æ¥ççå®ç°å¯¹æ°æ®çå å¯ï¼åªéè¦å¨é ç½®æ件é 置使ç¨åªä¸ç§å å¯ç®æ³åå¨å®ä½ç±»çå段å±æ§å ä¸æ³¨è§£@TableField(typeHandler = EncryptTypeHandler.class)å³å¯ã
è¿éæ们使ç¨aeså å¯ç®æ³ï¼
ptc:
encrypt:
algorithm: aes
å®ä½ç±»ï¼
@Data
@TableName(autoResultMap = true)
public class User {
private Long id;
private String name;
@TableField(typeHandler = EncryptTypeHandler.class)
private String mobile;
@TableField(typeHandler = EncryptTypeHandler.class)
private String idCard;
@TableField(typeHandler = EncryptTypeHandler.class)
private String bankCard;
@TableField(typeHandler = EncryptTypeHandler.class)
private String address;
}
å次æå ¥æ°æ®ï¼æ°æ®åºåå¨æ¥è¯¢ç»æå¦ä¸ï¼
id | name | mobile | id_card | bank_card | address |
1567405175268642818 | shepherd | 9MgWngwLcd/vbYYYpG9pGQ== | 97vlZQahK+y548ofQbXlW9JUwuzuj3xCkNF/is1KLa4= | 2oQv5+y4+rVyN23IzudtOz+Zd7Aj1Bv2toBzmnwTXxo= | 0Wj7qqLl6jWkBu+TcxuwGYcdIjv+zIJHDM7d1dU/c8D2jc2wLp+zVvpSwBKWjX44 |
ç¶åæ们å¯ä»¥æµè¯å¯¹è¿æ¡æ°æ®è¿è¡æ¥è¯¢ï¼
@Test
public void get() {
User user = userDAO.selectById(1567405175268642818l);
System.out.println(user);
}
ç»æå¦ä¸ï¼
User(id=1567405175268642818, name=shepherd, mobile=17812345678, idCard=213238199601182111, bankCard=3222022046741500, address=æå·å¸ä½æåºæªæ¥ç§æå)
åºäºä»¥ä¸å®ç¾å±ç¤ºäºæ°æ®å å¯åå¨å解å¯æ¥è¯¢ã
2.3 æ°æ®å å¯åæä¹è¿è¡æ¨¡ç³å¹é
å¯ç ãææºå·ã详ç»å°åãé¶è¡å¡å·è¿äºä¿¡æ¯å¯¹å 解å¯çè¦æ±ä¹ä¸ä¸æ ·ï¼æ¯å¦è¯´å¯ç æ们éè¦å å¯åå¨ï¼ä¸è¬ä½¿ç¨çé½æ¯ä¸å¯éçæ ¢hashç®æ³ï¼æ ¢hashç®æ³å¯ä»¥é¿å æ´åç ´è§£ï¼å ¸åçç¨æ¶é´æ¢å®å ¨æ§ï¼ã
å¨æ£ç´¢æ¶æ们æ¢ä¸éè¦è§£å¯ä¹ä¸éè¦æ¨¡ç³æ¥æ¾ï¼ç´æ¥ä½¿ç¨å¯æå®å ¨å¹é ï¼ä½æ¯ææºå·å°±ä¸è½è¿æ ·åï¼å 为ææºå·æ们è¦æ¥çåä¿¡æ¯ï¼å¹¶ä¸å¯¹ææºå·è¿éè¦æ¯æ模ç³æ¥æ¾ï¼å æ¤æ们ä»å¤©å°±é对å¯éå 解å¯çæ°æ®æ¯æ模ç³æ¥è¯¢æ¥ççæåªäºå®ç°æ¹å¼ã
æ们æ¥ä¸æ¥çç常è§çåæ³ï¼ä¹æ¯æ广æ³ä½¿ç¨çæ¹æ³ï¼æ¤ç±»æ¹æ³å满足çæ°æ®å®å ¨æ§ï¼å对æ¥è¯¢å好ã
- å¨æ°æ®åºå®ç°å å¯ç®æ³å½æ°ï¼å¨æ¨¡ç³æ¥è¯¢çæ¶å使ç¨decode(key) like '%partial%
å¨æ°æ®åºä¸å®ç°ä¸ç¨åºä¸è´çå 解å¯ç®æ³ï¼ä¿®æ¹æ¨¡ç³æ¥è¯¢æ¡ä»¶ï¼ä½¿ç¨æ°æ®åºå 解å¯å½æ°å 解å¯å模ç³æ¥æ¾ï¼è¿æ ·åçä¼ç¹æ¯å®ç°ææ¬ä½ï¼å¼å使ç¨ææ¬ä½ï¼åªéè¦å°ä»¥å¾ç模ç³æ¥æ¾ç¨å¾®ä¿®æ¹ä¸ä¸å°±å¯ä»¥å®ç°ï¼ä½æ¯ç¼ºç¹ä¹å¾ææ¾ï¼è¿æ ·åæ æ³å©ç¨æ°æ®åºçç´¢å¼æ¥ä¼åæ¥è¯¢ï¼çè³æä¸äºæ°æ®åºå¯è½æ æ³ä¿è¯ä¸ç¨åºå®ç°ä¸è´çå 解å¯ç®æ³ï¼ä½æ¯å¯¹äºå¸¸è§çå 解å¯ç®æ³é½å¯ä»¥ä¿è¯ä¸åºç¨ç¨åºä¸è´ãå¦æ对æ¥è¯¢æ§è½è¦æ±ä¸æ¯ç¹å«é«ã对æ°æ®å®å ¨æ§è¦æ±ä¸è¬ï¼å¯ä»¥ä½¿ç¨å¸¸è§çå 解å¯ç®æ³æ¯å¦è¯´AESãDESä¹ç±»çä¹æ¯ä¸ä¸ªä¸éçéæ©ã
- 对å¯ææ°æ®è¿è¡åè¯ç»åï¼å°åè¯ç»åçç»æéåå«è¿è¡å å¯ï¼ç¶ååå¨å°æ©å±åï¼æ¥è¯¢æ¶éè¿key like '%partial%' [å 对å符è¿è¡åºå®é¿åº¦çåç»ï¼å°ä¸ä¸ªå段æå为å¤ä¸ªï¼æ¯å¦è¯´æ ¹æ®4ä½è±æå符ï¼åè§ï¼ï¼2个ä¸æå符ï¼å ¨è§ï¼ä¸ºä¸ä¸ªæ£ç´¢æ¡ä»¶ï¼ä¸¾ä¸ªä¾å
shepherd使ç¨4个å符为ä¸ç»çå å¯æ¹å¼ï¼ç¬¬ä¸ç»shep ï¼ç¬¬äºç»heph ï¼ç¬¬ä¸ç»ephe ï¼ç¬¬åç»pher ⦠ä¾æ¬¡ç±»æ¨ã
å¦æéè¦æ£ç´¢ææå å«æ£ç´¢æ¡ä»¶4个å符çæ°æ®æ¯å¦ï¼pher ï¼å å¯å符åéè¿ key like â%partial%â æ¥åºã
åè¯å å¯å®ç°
public static String splitValueEncrypt(String value, int splitLength) {
    //æ£æ¥åæ°æ¯å¦åæ³
    if (StringUtils.isBlank(value) && splitLength <= 0) {
      return null;
   }
    String encryptValue = "";
    //è·åæ´ä¸ªå符串å¯ä»¥è¢«åå²æå符å串ç个æ°
    int n = (value.length() - splitLength + 1);
â
    //åè¯ï¼è§åï¼åè¯é¿åº¦æ ¹æ®ãsplitLengthãä¸æ¯æ¬¡åå²çå¼å§è·ç»æä¸æ å ä¸ï¼
    for (int i = 0; i < n; i++) {
      String splitValue = value.substring(i, splitLength++);
      encryptValue += encrypt(splitValue);
   }
â
    return encryptValue;
 }
â
  /**
  * è·åå å¯å¼
  *
  * @param value å å¯å¼
  * @return
  */
  private static String encrypt(String value) {
    // è¿éè¿è¡å å¯
    return  null;
 }
åºäºä¸é¢åè¯å å¯ä¿åå°æ©å±åï¼åæ¶è¦æ±å¯¹åå段çæ£å æ¹æ¥å¯¹éè¦å¯¹å ¶ç¸åºçæ©å±åéé ï¼è¿è¦æ³¨æç±äºåè¯ä¹å导è´æ©å±åçé¿åº¦å¯è½æ¯åå段å åçè³å ååï¼æ以å¡å¿ å¨å¼åä¹åéæ©ååéåè¯é¿åº¦åå å¯ç®æ³ï¼ä¸æ¦å å¯å¼å§ä¹åï¼åæ´æ¹ææ¬å°±è¾é«äºãåå¦æææºå·æ们åªæ¯æå8ä½æç´¢ã身份è¯å·åªæ¯æå4ä½æç´¢ï¼è¿æ ·æ们就å¯ä»¥éè¿åå段æªååé¢ä½æ°ç´æ¥å å¯åå¨å°æ©å±åï¼ä¸éè¦ååè¯ã
3.æ°æ®è±æ
å®é çä¸å¡å¼åè¿ç¨ä¸ï¼æ们ç»å¸¸éè¦å¯¹ç¨æ·çéç§æ°æ®è¿è¡è±æå¤çãæè°è±æå¤çå ¶å®å°±æ¯å°æ°æ®è¿è¡æ··æ·éèï¼ä¾å¦ç¨æ·ææºä¿¡æ¯å±ç¤º178****5939ï¼ä»¥å æ³é²ä¸ªäººéç§ä¿¡æ¯ã
3.1å®ç°æè·¯
æè·¯æ¯è¾ç®åï¼å¨æ¥å£è¿åæ°æ®ä¹åæè¦æ±å¯¹æ°æ®è¿è¡è±æå å·¥ä¹ååè¿åå端ã
ä¸å¼å§æç®ç¨@ControllerAdviceå»å®ç°ï¼ä½åç°éè¦èªå·±å»åå°ç±»è·å注解ï¼å½è¿å对象æ¯è¾å¤æï¼éè¦éå½å»åå°ï¼æ§è½ä¸ä¸åå°±ä¼éä½ï¼äºæ¯æ¢ç§æè·¯ï¼ææ³å°å¹³æ¶ä½¿ç¨ç@JsonFormatï¼è·æç°å¨çåºæ¯å¾ç±»ä¼¼ï¼éè¿èªå®ä¹æ³¨è§£è·å段解æå¨ï¼å¯¹å段è¿è¡èªå®ä¹è§£æã
è±æå段类åæ举
public enum MaskEnum {
  /**
  * ä¸æå
  */
  CHINESE_NAME,
  /**
  * 身份è¯å·
  */
  ID_CARD,
  /**
  * 座æºå·
  */
  FIXED_PHONE,
  /**
  * ææºå·
  */
  MOBILE_PHONE,
  /**
  * å°å
  */
  ADDRESS,
  /**
  * çµåé®ä»¶
  */
  EMAIL,
  /**
  * é¶è¡å¡
  */
  BANK_CARD
}
è±æ注解类ï¼ç¨å¨è±æå段ä¹ä¸
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonSerialize(using = MaskSerialize.class)
public @interface FieldMask {
â
  /**
  * è±æç±»å
  * @return
  */
  MaskEnum value();
}
è±æåºååç±»
public class MaskSerialize extends JsonSerializer<String> implements ContextualSerializer {
â
  /**
  * è±æç±»å
  */
  private MaskEnum type;
â
â
  @Override
  public void serialize(String s, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
    switch (this.type) {
      case CHINESE_NAME:
     {
        jsonGenerator.writeString(MaskUtils.chineseName(s));
        break;
     }
      case ID_CARD:
     {
        jsonGenerator.writeString(MaskUtils.idCardNum(s));
        break;
     }
      case FIXED_PHONE:
     {
        jsonGenerator.writeString(MaskUtils.fixedPhone(s));
        break;
     }
      case MOBILE_PHONE:
     {
        jsonGenerator.writeString(MaskUtils.mobilePhone(s));
        break;
     }
      case ADDRESS:
     {
        jsonGenerator.writeString(MaskUtils.address(s, 4));
        break;
     }
      case EMAIL:
     {
        jsonGenerator.writeString(MaskUtils.email(s));
        break;
     }
      case BANK_CARD:
     {
        jsonGenerator.writeString(MaskUtils.bankCard(s));
        break;
     }
   }
 }
â
  @Override
  public JsonSerializer <?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) throws JsonMappingException {
    // 为空ç´æ¥è·³è¿
    if (beanProperty == null) {
      return serializerProvider.findNullValueSerializer(beanProperty);
   }
    // éStringç±»ç´æ¥è·³è¿
    if (Objects.equals(beanProperty.getType().getRawClass(), String.class)) {
      FieldMask fieldMask = beanProperty.getAnnotation(FieldMask.class);
      if (fieldMask == null) {
        fieldMask = beanProperty.getContextAnnotation(FieldMask.class);
     }
      if (fieldMask != null) {
        // å¦æè½å¾å°æ³¨è§£ï¼å°±å°æ³¨è§£ç value ä¼ å
¥ MaskSerialize
        return new MaskSerialize(fieldMask.value());
     }
   }
    return serializerProvider.findValueSerializer(beanProperty.getType(), beanProperty);
 }
â
  public MaskSerialize() {}
â
  public MaskSerialize(final MaskEnum type) {
    this.type = type;
 }
}
3.2使ç¨ç¤ºä¾
å¨åéçä¿¡è®°å½çæ¥å£ä¸å¯¹ææºå·è¿è¡è±æï¼
@FieldMask(MaskEnum.MOBILE_PHONE)
  private String mobile;
è°ç¨æ¥å£è¿åæ°æ®å¦ä¸ï¼
{
 "code": 200,
 "msg": "OK",
 "data": {
  "list": [
  {
    "id": 1565599123774607362,
    "signId": 8389008488923136,
    "templateId": 8445337328943104,
    "templateType": 1,
    "content": "å¯ç±ç${name}ï¼å客æç« å·²äº${submitTime}ä¸ä¼ æ´æ°ï¼è¯·æ½ç©ºæµè§ã",
    "channelType": 0,
    "mobile": "178****5939",
    "sendStatus": 0,
    "receiveStatus": 0
  }
 ],
  "total": 19,
  "pages": 19
}
}
4.æ»ç»
åºäºä¸é¢å 容æ们æ»ç»å¦ä½å¨æ°æ®åå¨å±è¿è¡æ°æ®å®å ¨å åºæ¥è¾¾å°ç³»ç»çæ´å®å ¨æ§ï¼å¯ä»¥è¿ä¹è¯´æ²¡ææå®å ¨çç³»ç»åªææ´å®å ¨çç³»ç»ãæ以æ们å¨å¼ååç¨ä¸é½ä¼ç©·æä¸çå»å åºç³»ç»å®å ¨æ§è½ãå½ç¶äºï¼å 强系ç»å®å ¨æ§çæ¹å¼è¿æå¾å¤ç§ï¼æ们æè¿åªæ¯å´ç»åºäºSpring BootåSpringMVCæ¡æ¶ä¸ææä¼é å°å®ç°æ°æ®å®å ¨æ§ï¼æå ´è¶£çå°ä¼ä¼´å¯ä»¥èªè¡äºè§£å ¶ä»å åºæ¹å¼ã