案例中使用的springboot的版本为2.0.4.RELEASE
1.添加fastjson依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.49</version>
</dependency>
2.修改springboot默认的json转换工具为fastjson(如果不需要自定义注解序列化,注释掉fastJsonConfig.setSerializeFilters(new ZreContextValueFilter())这个就可以了)
@Configuration
public class ConverterConfig {
@Bean
public HttpMessageConverters fastJsonHttpMessageConverters() {
//创建FastJson信息转换对象
FastJsonHttpMessageConverter fastJsonHttpMessageConverter =
new FastJsonHttpMessageConverter();
//创建FastJson对象并设定序列化规则
FastJsonConfig fastJsonConfig = new FastJsonConfig();
//添加自定义valueFilter
fastJsonConfig.setSerializeFilters(new ZreContextValueFilter());
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
fastJsonHttpMessageConverter.setSupportedMediaTypes(Arrays.asList(MediaType.APPLICATION_JSON_UTF8));
//规则赋予转换对象
fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
StringHttpMessageConverter stringHttpMessageConverter =
new StringHttpMessageConverter(Charset.forName("UTF-8"));
return new HttpMessageConverters(fastJsonHttpMessageConverter, stringHttpMessageConverter);
}
}
3.创建自定义注解NumberDesensitization
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface NumberDesensitization {
}
4.创建ZreContextValueFilter类实现ContextValueFilter,至于为什么要实现这个类,可以参考下这篇博客(springboot工程中用自定义注解的方式json序列化(fastjson)和ContextValueFilter)
public class ZreContextValueFilter implements ContextValueFilter {
private final static Logger logger = LoggerFactory.getLogger(ZreContextValueFilter.class);
@Override
public Object process(BeanContext context, Object object, String name, Object value) {
if (value == null || !(value instanceof String)) {
return value;
}
NumberDesensitization annation = context.getAnnation(NumberDesensitization.class);
if (annation == null) {
return value;
}
String propertyValue = (String) value;
if (StringUtils.isEmpty(propertyValue)) {
return "";
}
logger.debug("脱敏手机号成功:"+propertyValue);
propertyValue = String.format("%s****%s",propertyValue.substring(0, 3), propertyValue.substring(7));
return propertyValue;
}
}
5.给javaBean添加自定义注解@NumberDesensitization
public class SysUser implements Serializable{
private static final long serialVersionUID = 1L;
private String username;
private String loginCode;
private String password;
private Date createDate;
private String mobile;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@JSONField(serialize = false)
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
public String getLoginCode() {
return loginCode;
}
public void setLoginCode(String loginCode) {
this.loginCode = loginCode;
}
@NumberDesensitization
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
}
6.验证结果
{
code: 1,
data: {
createDate: "2018-07-14 15:56:27",
loginCode: "system",
mobile: "183****2234",
username: "超级管理员"
},
message: "success"
}
好了,到这里就完成了自定义注解了,注意实现了ContextValueFilter后需要将实现类添加到FastJsonConfig的serializeFilters中,本人小白一枚,有哪里写的不对的地方,欢迎评论指出。