Mybatis-plus 空值不返回问题

最近springBoot项目mybatis获取字段为null时候返回前端不显示,这不是我想要的结果。我想要结果无论null还是空字段串都给前端返回字段。


@Configuration
@EnableWebMvc
public class GlobalResourceConfig implements WebMvcConfigurer {

/**
* 使用阿里 FastJson 作为JSON MessageConverter
*/
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
FastJsonConfig config = new FastJsonConfig();
//保留空的字段
config.setCharset(StandardCharsets.UTF_8);
config.setSerializerFeatures(SerializerFeature.WriteMapNullValue,SerializerFeature.WriteDateUseDateFormat,SerializerFeature.PrettyFormat,SerializerFeature.WriteMapNullValue);
//SerializerFeature.PrettyFormat 这是格式化返回前端
//SerializerFeature.WriteMapNullValue 这是mybatis-plus 查询到以后不管有没有值都返回给前端
//        SerializerFeature.WriteNullStringAsEmpty,//String null -> "" 这是String类型如果为null则返回""
// SerializerFeature.WriteNullNumberAsZero//Number null -> 0这是Number类型如果为null则返回0

// 格式化输出
//SerializerFeature.PrettyFormat,
// 消除循环引用
//SerializerFeature.DisableCircularReferenceDetect,
// 返回结果保留null值
//SerializerFeature.WriteMapNullValue,
// 将返回值为null的字符串转变成"",在这里可以自己设置
//SerializerFeature.WriteNullStringAsEmpty,
// List字段如果为null,输出为[],而非null
//SerializerFeature.WriteNullListAsEmpty

// 解决 SerializerFeature.WriteNullStringAsEmpty 不生效问题
ValueFilter valueFilter = (object, name, value) -> {
if (null == value){
value = "";
}
return value;
};

// 设置全局日期格式
//fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");

// 注入过滤器
//fastJsonConfig.setSerializeFilters(valueFilter);

// Long、BigDecimal 序列化时转 String
//SerializeConfig serializeConfig = SerializeConfig.globalInstance;
//serializeConfig.put(Long.class, ToStringSerializer.instance);
//serializeConfig.put(Long.TYPE, ToStringSerializer.instance);
//serializeConfig.put(BigDecimal.class, ToStringSerializer.instance);
// 在转换器中添加配置信息
//fastJsonConfig.setSerializeConfig(serializeConfig);
//fastConverter.setDefaultCharset(StandardCharsets.UTF_8);
//fastConverter.setFastJsonConfig(fastJsonConfig);

// 解决中文乱码问题,相当于在Controller上的@RequestMapping中加了个属性produces = "application/json"
//List<MediaType> mediaTypeList = new ArrayList<>();
//mediaTypeList.add(MediaType.APPLICATION_JSON);
//fastConverter.setSupportedMediaTypes(mediaTypeList);

//return new HttpMessageConverters(fastConverter);

//处理中文乱码问题
        List<MediaType> fastMediaTypes = new ArrayList<>();
        fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);

SerializerFeature.PrettyFormat:格式化输出
SerializerFeature.WriteMapNullValue:是否输出值为null的字段,默认为false
SerializerFeature.DisableCircularReferenceDetect:消除循环引用
SerializerFeature.WriteNullStringAsEmpty:将为null的字段值显示为""
WriteNullListAsEmpty:List字段如果为null,输出为[],而非null
WriteNullNumberAsZero:数值字段如果为null,输出为0,而非null
WriteNullBooleanAsFalse:Boolean字段如果为null,输出为false,而非null
SkipTransientField:如果是true,类中的Get方法对应的Field是transient,序列化时将会被忽略。默认为true
SortField:按字段名称排序后输出。默认为false
WriteDateUseDateFormat:全局修改日期格式,默认为false。JSON.DEFFAULT_DATE_FORMAT = “yyyy-MM-dd”;JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);
BeanToArray:将对象转为array输出
QuoteFieldNames:输出key时是否使用双引号,默认为true
UseSingleQuotes:输出key时使用单引号而不是双引号,默认为false(经测试,这里的key是指所有的输出结果,而非key/value的key,而是key,和value都使用单引号或双引号输出)


// 按需配置,更多参考FastJson文档哈
MediaType[] mediaTypes = new MediaType[]{
MediaType.APPLICATION_OCTET_STREAM,
MediaType.APPLICATION_JSON,
MediaType.TEXT_HTML,
MediaType.TEXT_PLAIN,
MediaType.TEXT_XML,
MediaType.APPLICATION_STREAM_JSON,
MediaType.APPLICATION_ATOM_XML,
MediaType.APPLICATION_FORM_URLENCODED,
MediaType.APPLICATION_PDF,
};
converter.setSupportedMediaTypes(Arrays.asList(mediaTypes));
converter.setFastJsonConfig(config);
converter.setDefaultCharset(StandardCharsets.UTF_8);
// converter.setSupportedMediaTypes(Collections.singletonList(MediaType.APPLICATION_JSON_UTF8));
converters.add(new ByteArrayHttpMessageConverter());
converters.add(converter);
}


@Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/"); registry.addResourceHandler("/script/**").addResourceLocations("classpath:/script/"); registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/"); registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); } }

二 配置信息

名称 含义
QuoteFieldNames 输出key时是否使用双引号,默认为true    
UseSingleQuotes 使用单引号而不是双引号,默认为false
WriteMapNullValue 是否输出值为null的字段,默认为false
WriteEnumUsingToString Enum输出name()或者original,默认为false     
UseISO8601DateFormat Date使用ISO8601格式输出,默认为false    
WriteNullListAsEmpty List字段如果为null,输出为[],而非null     
WriteNullStringAsEmpty 字符类型字段如果为null,输出为”“,而非null
WriteNullNumberAsZero 数值字段如果为null,输出为0,而非null     
WriteNullBooleanAsFalse Boolean字段如果为null,输出为false,而非null     
SkipTransientField 如果是true,类中的Get方法对应的Field是transient,序列化时将会被忽略。默认为true
SortField 按字段名称排序后输出。默认为false    
WriteTabAsSpecial 把\t做转义输出,默认为false
PrettyFormat 结果是否格式化,默认为false
WriteClassName 序列化时写入类型信息,默认为false。反序列化是需用到    
DisableCircularReferenceDetect 消除对同一对象循环引用的问题,默认为false    
WriteSlashAsSpecial 对斜杠’/’进行转义    
BrowserCompatible 将中文都会序列化为\uXXXX格式,字节数会多一些,但是能兼容IE 6,默认为false
WriteDateUseDateFormat 全局修改日期格式,默认为false。JSON.DEFFAULT_DATE_FORMAT = “yyyy-MM-dd”;JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);
DisableCheckSpecialChar 一个对象的字符串属性中如果有特殊字符如双引号,将会在转成json时带有反斜杠转移符。如果不需要转义,可以使用这个属性。默认为false    
NotWriteRootClassName  不知道
BeanToArray 将对象转为array输出    
WriteNonStringKeyAsString 不是String的字段写为String    
NotWriteDefaultValue 不设默认值     
BrowserSecure  不知道
IgnoreNonFieldGetter 忽略没有getter方法的属性
WriteEnumUsingName

目前版本的fastjson默认对enum对象使用WriteEnumUsingName属性,因此会将enum值序列化为其Name。
使用WriteEnumUsingToString方法可以序列化时将Enum转换为toString()的返回值;同时override toString函数能够将enum值输出需要的形式。但是这样做会带来一个问题,对应的反序列化使用的Enum的静态方法valueof可能无法识别自行生成的toString(),导致反序列化出错。
如果将节省enum序列化后的大小,可以将enum序列化其ordinal值,保存为int类型。fastJson在反序列化时,如果值为int,则能够使用ordinal值匹配,找到合适的对象。
fastjson要将enum序列化为ordinal只需要禁止WriteEnumUsingName feature。
首先根据默认的features排除WriteEnumUsingName,然后使用新的features序列化即可。

 

 
 
posted @ 2022-08-14 17:42  全琪俊  阅读(1735)  评论(1编辑  收藏  举报