package com.sankuai.mall.sqm.api.web.controller.tool;
import com.fasterxml.jackson.annotation.JsonFilter;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
import com.fasterxml.jackson.databind.ser.PropertyWriter;
import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;
import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.apache.thrift.TBase;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
public class CustomObjectMapper extends ObjectMapper {
static final String DYNC_FILTER = "DYNC_FILTER";
static final String Customer_DYNC_FILTER = "Customer_DYNC_FILTER";
@JsonFilter(DYNC_FILTER)
interface DynamicFilter {
}
@JsonFilter(Customer_DYNC_FILTER)
interface CustomerDynamicFilter {
}
private void registerCustomerModule() {
// 序列换成json时,将所有的long变成string,因为js中得数字类型不能包含所有的java long值
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
registerModule(simpleModule);
registerModule(new CustomEnumModule());
}
private void setCustomerFilterProvider(){
//排除thrift实体自动生成的属性
//以set开头
Set<String> prffixProperties=new HashSet<>();
prffixProperties.add("setSet");
//以Iterator结尾
Set<String> suffixProperties=new HashSet<>();
suffixProperties.add("Iterator");
SimpleBeanPropertyFilter theFilter = new SerializeExceptFilter(null,prffixProperties,suffixProperties,null);
SimpleFilterProvider filter = new SimpleFilterProvider();
filter.addFilter(DYNC_FILTER, theFilter);
// //如果thrift实体中的属性名称本身以set开头
// Set<String> customerPrffixProperties=new HashSet<>();
// customerPrffixProperties.add("setSet");
// SimpleBeanPropertyFilter customerFilter = new SerializeExceptFilter(null,customerPrffixProperties,suffixProperties,null);
// filter.addFilter(Customer_DYNC_FILTER, customerFilter);
setFilterProvider(filter);
//setFilterProvider方法表示添加了一个filter,只对添加了@JsonFilter(DYNC_FILTER)的class生效
//可以通过addMixIn,给指定的class生效特定的filter
//所有类都生效这个filter
//addMixIn(Object.class, DynamicFilter.class);
addMixIn(TBase.class, DynamicFilter.class);
//需要特殊处理的thrift类
//addMixIn(ApiZZZZResponse.class, CustomerDynamicFilter.class);
}
public CustomObjectMapper() {
disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
// 设置日期转换yyyy-MM-dd HH:mm:ss
//setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
registerCustomerModule();
setCustomerFilterProvider();
}
public class SerializeExceptFilter
extends SimpleBeanPropertyFilter
implements java.io.Serializable
{
private static final long serialVersionUID = 1L;
/**
* Set of property names to filter out.
*/
protected final Set<String> _propertiesToExclude;
/**
* 前缀
*/
protected final Set<String> _prffixPropertiesToExclude;
/**
* 后缀
*/
protected final Set<String> _suffixPropertiesToExclude;
/**
* 包含
*/
protected final Set<String> _contansPropertiesToExclude;
SerializeExceptFilter() {
_propertiesToExclude = Collections.emptySet();
_prffixPropertiesToExclude = Collections.emptySet();
_suffixPropertiesToExclude = Collections.emptySet();
_contansPropertiesToExclude = Collections.emptySet();
}
public SerializeExceptFilter(Set<String> properties,Set<String> prffixProperties,Set<String> suffixProperties,Set<String> contansProperties) {
_propertiesToExclude = properties==null?Collections.emptySet():properties;
_prffixPropertiesToExclude = prffixProperties==null?Collections.emptySet():prffixProperties;
_suffixPropertiesToExclude = suffixProperties==null?Collections.emptySet():suffixProperties;
_contansPropertiesToExclude = contansProperties==null?Collections.emptySet():contansProperties;
}
@Override
protected boolean include(BeanPropertyWriter writer) {
return !exclude(writer.getName());
}
@Override
protected boolean include(PropertyWriter writer) {
return !exclude(writer.getName());
}
private boolean exclude(String name){
boolean exclude=_propertiesToExclude.contains(name)||
_prffixPropertiesToExclude.stream().filter(k->name.startsWith(k)).count()>0||
_suffixPropertiesToExclude.stream().filter(k->name.endsWith(k)).count()>0||
_contansPropertiesToExclude.stream().filter(k->name.contains(k)).count()>0;
return exclude;
}
}
}