springboot 修改fastjson序列化javabean并添加自定义注解

案例中使用的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中,本人小白一枚,有哪里写的不对的地方,欢迎评论指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值