map mybatis 的字段返回0_使用MyBatis返回map对象,字段值为null时不返回或返回null,目标返回自定义的默认值......

该博客介绍了如何在使用MyBatis返回Map对象时,将字段值为null的情况处理为返回自定义默认值,如0。通过自定义Jackson序列化器实现对Boolean和自定义类型Message的转换,确保在序列化过程中空值被适当替换。
摘要由CSDN通过智能技术生成

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 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值