- 定义一个实体类
java
@Data
public class UserModel {
private Integer id;
private String userName;
private String idCard;
}
- 定义一个控制器
javascript
@RestController
public class TestController {
@GetMapping("getUser")
public UserModel getUser(){
UserModel userModel = new UserModel();
userModel.setId(1);
userModel.setUserName("林青霞");
userModel.setIdCard("3856597623");
return userModel;
}
}
控制器返回一个User对象,但是想对User对象的idCard属性值做脱敏处理,字符串后四位用*代替。
这里可以考虑使用Jackson自定义的序列化器实现,就类似于@DateFormat注解的实现效果。
- 自定义一个属性序列化器
java
public class IdCardDesensitizeHandler extends JsonSerializer {
@Override
public String doDesensitize(String value) {
if (value != null && value.length() > 4){
//后四位替换为*
value = value.substring(0,value.length() - 4) + "****";
}
return value;
}
@Override
public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
if (o instanceof String){
String value = (String) o;
jsonGenerator.writeString(doDesensitize(value));
}
}
}
自定义序列化器,继承JsonSerializer,重写serialize方法
- 标识对象属性自定义的序列化器,在idCard属性上标注 @JsonSerialize(using = IdCardDesensitizeHandler.class)
java
@Data
public class UserModel {
private Integer id;
private String userName;
@JsonSerialize(using = IdCardDesensitizeHandler.class)
private String idCard;
}
SpringMVC在将对象转Json时用到了Jackson类库的ObjectMapper对象实现的,Jackson提供了自定义对象属性序列化器功能,当需要序列化idCard字段时,会自动调用注解指定的IdCardDesensitizeHandler序列化器完成实现。
一般在开发框架时都会提供各种场景的功能扩展点,例如SpringMVC自定义注解实现参数封装、自定义参数校验器,拦截器,Mybatis的statementhandler等,灵活使用这些扩展机制可以实现更强大的功能。