一、反射
用反射的方法,把返回的信息,解析出来,如果是Integer,并且值是null,展示成0
/**
* 给object中的Integer设置默认值0
*
* @param object
*/
public void setDefaultValue(Object object) {
if (object != null) {
// 拿到该类
Class<?> clz = object.getClass();
// 获取实体类的所有属性,返回Field数组
Field[] fields = clz.getDeclaredFields();
for (Field field : fields) {
try {
// 如果类型是Integer
if (field.getGenericType().toString().equals(
"class java.lang.Integer")) {
Method m = (Method) object.getClass().getMethod(
"get" + getMethodName(field.getName()));
Integer val = (Integer) m.invoke(object);
// 如果字段值是null, 给默认值0
if (val == null) {
Method setMethod = clz.getMethod("set" + getMethodName(field.getName()), Integer.class);
setMethod.invoke(object, 0);
}
}
// 如果类型是List
if (field.getGenericType().toString().equals("java.util.List<T>")) {
Method m = object.getClass().getMethod("get" + getMethodName(field.getName()));
List<T> val = (List) m.invoke(object);
if (val != null) {
val.forEach(t -> setDefaultValue(t));
}
}
} catch (Exception e) {
Console.error(e);
}
}
}
}
/**
* 获取方法名 把一个字符串的第一个字母大写、效率是最高的、 abc =》 Abc
*
* @param filedName 属性名
* @return 方法名
*/
private static String getMethodName(String filedName) {
byte[] items = filedName.getBytes();
items[0] = (byte) ((char) items[0] - 'a' + 'A');
return new String(items);
}
二、自定义注解
自定义注解@IntegerDefaultValue 放在字段上,这个可以按照字段赋值
自定义注解
import java.lang.annotation.*;
/**
* @author CelineT
* @date 2022/1/21 16:37
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface IntegerDefaultValue {
int defaultValue() default 0;
}
注解过滤器
import com.alibaba.fastjson.serializer.ValueFilter;
import lombok.extern.slf4j.Slf4j;
import java.lang.reflect.Field;
/**
* @author CelineT
* @date 2022/1/21 16:56
*/
@Slf4j
public class ValueDefaultFilter implements ValueFilter {
@Override
public Object process(Object object, String name, Object value) {
IntegerDefaultValue desensitization;
Field field = null;
try {
field = object.getClass().getDeclaredField(name);
if ((desensitization = field.getAnnotation(IntegerDefaultValue.class)) == null) {
return value;
}
} catch (NoSuchFieldException e) {
log.debug("当前数据类型为{}, 属性为:{},值为{}", object.getClass(), name, value);
return value;
} catch (Exception e){
log.error(e.getMessage());
return value;
}
int defaultVal = desensitization.defaultValue();
if (value == null) {
return defaultVal;
}
return value;
}
}
拦截器
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import com.whoa.creator.modules.analysis.entity.vo.ValueDefaultFilter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* @author CelineT
* @date 2022/1/21 17:02
*/
@Configuration
@Slf4j
public class WebConverterConfigurer implements WebMvcConfigurer {
/**
* 配置fastjson为默认JSON转换
*
* @return
*/
@Bean
public HttpMessageConverters fastJsonHttpMessageConverters() {
log.info("启用自定义注解!!!");
// 1.定义一个converters转换消息的对象
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
// 2.添加fastjson的配置信息,比如: 是否需要格式化返回的json数据
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
//添加自己写的拦截器
fastJsonConfig.setSerializeFilters(new ValueDefaultFilter());
// 3.在converter中添加配置信息
fastConverter.setFastJsonConfig(fastJsonConfig);
// 4.将converter赋值给HttpMessageConverter
HttpMessageConverter<?> converter = fastConverter;
// 5.返回HttpMessageConverters对象
return new HttpMessageConverters(converter);
}
}
三、注解
@JsonInclude
配合JacksonConfig中序列化NULL值为0
这个方法最简单,最便捷