软件编程
位置:首页>> 软件编程>> java编程>> springboot配置Jackson返回统一默认值的实现示例

springboot配置Jackson返回统一默认值的实现示例

作者:阿豪_mike  发布时间:2023-12-08 13:55:22 

标签:springboot,Jackson,返回统一默认值

在项目开发中,我们返回的数据或者对象没有的时候一般直接返回的null

有数据时的返回值


{
"flag": true,
"code": "10000",
"msg": "成功!",
"data": {
 "id": 32,
 "templateType": 1,
 "templateName": "我的测试模板1",
 "freightName": "我的测试标题1",
 "listArea": [
  {
   "id": 968,
   "templateId": 32,
   "freightPrice": 15,
  }
 ],
 "templateDescEntity": {
  "id": 1
  "name": "xxx"
 }
}
}

没有数据时的返回值


{
"flag": true,
"code": "10000",
"msg": "成功!",
"data": {
 "id": 32,
 "templateType": 1,
 "templateName": null,
 "freightName": null,
 "listArea": null,
 "templateDescEntity": null
}
}

这种情况下数据返回给前端,前端需要做大量的空值判断
如前端调使用属性data.templateDescEntity.id的时候就会直接报异常
此时我们可以使用返回值统一处理,配置如下

pom.xml添加


<dependency>
   <groupId>com.fasterxml.jackson.core</groupId>
   <artifactId>jackson-annotations</artifactId>
   <version>2.9.5</version>
</dependency>
<dependency>
   <groupId>com.fasterxml.jackson.core</groupId>
   <artifactId>jackson-databind</artifactId>
</dependency>

java类添加配置


package com.ys.mall.core.product.config;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;

import java.io.IOException;
import java.lang.reflect.Field;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
* 数据返回给前端时,设置null值默认为""
*
* @author cgh
* @date 2020/12/14 10:35
*/
@Configuration
public class JacksonConfig {

@Bean
   @Primary
   @ConditionalOnMissingBean(ObjectMapper.class)
   public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
       ObjectMapper objectMapper = builder.createXmlMapper(false).build();
       objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
           @Override
           public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
               String fieldName = jsonGenerator.getOutputContext().getCurrentName();
               try {
                   //反射获取字段类型
                   Field field = jsonGenerator.getCurrentValue().getClass().getDeclaredField(fieldName);
                   if (CharSequence.class.isAssignableFrom(field.getType())) {
                       //字符串型空值""
                       jsonGenerator.writeString("");
                       return;
                   } else if (Collection.class.isAssignableFrom(field.getType())) {
                       //列表型空值返回[]
                       jsonGenerator.writeStartArray();
                       jsonGenerator.writeEndArray();
                       return;
                   } else if (Map.class.isAssignableFrom(field.getType())) {
                       //map型空值 或者 bean对象 返回{}
                       jsonGenerator.writeStartObject();
                       jsonGenerator.writeEndObject();
                       return;
                   }
               } catch (NoSuchFieldException ignored) {
               }

jsonGenerator.writeString("");
           }
       });
       return objectMapper;
   }
}

添加空值统一处理后的返回值


{
"flag": true,
"code": "10000",
"msg": "成功!",
"data": {
 "id": 32,
 "templateType": 1,
 "templateName": "",
 "freightName": "",
 "listArea": [],
 "templateDescEntity": {}
}
}

来源:https://juejin.cn/post/6989848776361902088

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com