1 packagemodule.spring;2
3 importcom.fasterxml.jackson.annotation.JsonInclude;4 importcom.fasterxml.jackson.core.JsonGenerator;5 importcom.fasterxml.jackson.databind.JsonSerializer;6 importcom.fasterxml.jackson.databind.ObjectMapper;7 importcom.fasterxml.jackson.databind.SerializationFeature;8 importcom.fasterxml.jackson.databind.SerializerProvider;9 importcom.fasterxml.jackson.databind.introspect.Annotated;10 importcom.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;11 importcom.fasterxml.jackson.databind.module.SimpleModule;12 importcom.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;13 importcom.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;14 importmessage.Message;15 importorg.apache.commons.lang3.ClassUtils;16 importorg.springframework.http.HttpOutputMessage;17 importorg.springframework.http.converter.HttpMessageNotWritableException;18 importorg.springframework.http.converter.json.MappingJackson2HttpMessageConverter;19
20 importjava.io.IOException;21 importjava.lang.reflect.Type;22 import java.util.*;23
24 public class JSON extendsMappingJackson2HttpMessageConverter {25
26 private static final ThreadLocal> LOCAL_FILTER = new ThreadLocal<>();27
28 privateObjectMapper ObjectMapperCopy;29
30 publicJSON() {31 }32
33 publicJSON(ObjectMapper objectMapper) {34 super(objectMapper);35 objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);36 objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);37 objectMapper.registerModule(new SimpleModule().addSerializer(Boolean.class,newBooleanJsonSerializer()));38 //objectMapper.registerModule(new SimpleModule().addSerializer(Message.class,new MessageJsonSerializer()));
39 this.ObjectMapperCopy =objectMapper.copy();40 }41
42 @Override43 protected void writeInternal(Object object, Type type, HttpOutputMessage outputMessage) throwsIOException, HttpMessageNotWritableException {44 this.objectMapper =ObjectMapperCopy.copy();45 SimpleFilterProvider filterProvider = newSimpleFilterProvider();46 if (getLocalFilter().size() > 0) {47 for (Map.Entryfilter : getLocalFilter().entrySet()) {48 if(filter.getValue().mode ==Filter.Mode.EXCEPT){49 filterProvider.addFilter(filter.getKey().getName(), SimpleBeanPropertyFilter.serializeAllExcept(filter.getValue().field));50 }else if(filter.getValue().mode ==Filter.Mode.INCLUDE){51 filterProvider.addFilter(filter.getKey().getName(), SimpleBeanPropertyFilter.filterOutAllExcept(filter.getValue().field));52 }53 }54 this.objectMapper.setFilterProvider(filterProvider);55 this.objectMapper.setAnnotationIntrospector(newJacksonAnnotationIntrospector() {56 @Override57 publicObject findFilterId(Annotated a) {58 return (ClassUtils.isAssignable(a.getClass(), com.fasterxml.jackson.databind.introspect.AnnotatedClass.class) && getLocalFilter().containsKey(a.getType().getRawClass())) ? a.getName() : null;59 }60 });61 }62 super.writeInternal(object, type, outputMessage);63 clearLocalFilter();64 }65
66
67 public static voidexcept(Class aClass, String... field){68 if(getLocalFilter().containsKey(aClass)){69 throw new FilterException("filter exists");70 }71 getLocalFilter().put(aClass,newFilter(field, Filter.Mode.EXCEPT));72 }73
74 public static voidinclude(Class aClass, String... field){75 if(getLocalFilter().containsKey(aClass)){76 throw new FilterException("filter exists");77 }78 getLocalFilter().put(aClass,newFilter(field, Filter.Mode.INCLUDE));79 }80
81 private static MapgetLocalFilter() {82 if(LOCAL_FILTER.get() == null){83 LOCAL_FILTER.set(new HashMap<>());84 }85 returnLOCAL_FILTER.get();86 }87
88 private static voidclearLocalFilter(){89 LOCAL_FILTER.remove();90 }91
92 private static classFilter {93 privateString[] field;94 privateFilter.Mode mode;95
96 privateFilter(String[] field,Filter.Mode mode){97 this.field =field;98 this.mode =mode;99 }100
101 private enumMode{102 EXCEPT,103 INCLUDE104 }105 }106
107 private final static class FilterException extendsRuntimeException {108
109 privateFilterException(String message) {110 super(message);111 }112 }113
114 private final class BooleanJsonSerializer extends JsonSerializer{115
116 @Override117 public void serialize(Boolean value, JsonGenerator gen, SerializerProvider serializers) throwsIOException {118 gen.writeNumber(value ? 1 : 0);119 }120 }121
122 private final class MessageJsonSerializer extends JsonSerializer{123
124 @Override125 public void serialize(Message message, JsonGenerator gen, SerializerProvider serializers) throwsIOException {126 if( message.getData() instanceofList){127 gen.writeNumber(0);128 }129 if( message.getData() instanceofMap){130 Map map=(Map)message.getData();131 Set set =map.keySet();132 for(String str:set133 ) {134 if(map.get(str) instanceofString){135 map.put(str,"");136 }137 if(map.get(str) instanceofDate){138 map.put(str,0);139 }140 if(map.get(str) instanceofNumber){141 map.put(str,0);142 }143
144 }145 }146 gen.writeNumber(com.alibaba.fastjson.JSON.toJSONString(message));147 }148 }149 }