SpringBoot ResponseBody返回值处理的实现

1. SpringBoot ResponseBody 返回值中null值处理

@PostMapping(path = "/test", produces = MediaType.APPLICATION_JSON_VALUE)
public Object test() {
 JSONObject jsonObject = new JSONObject();
 jsonObject.put("test","test");
 jsonObject.put("testnull",null);
 ApiResponseVo apiResponseVo = new ApiResponseVo();
 apiResponseVo.setData(jsonObject );
 apiResponseVo.setStatus(0);
 return apiResponseVo;
}

接口返回 (想实现将testnull也进行返回<null展示null还是0还是"" 可自定义>) :

{
  "data": {
    "test": "test"
  },
  "status": 0
}
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
@Configuration
public class fastJsonConfig extends WebMvcConfigurationSupport {
 @Override
 public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
 FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
 FastJsonConfig config = new FastJsonConfig();
 config.setSerializerFeatures(
  // 保留 Map 空的字段
  SerializerFeature.WriteMapNullValue,
  // 将 String 类型的 null 转成""
//        SerializerFeature.WriteNullStringAsEmpty,
        // 将 Number 类型的 null 转成 0
//        SerializerFeature.WriteNullNumberAsZero,
        // 将 List 类型的 null 转成 []
//        SerializerFeature.WriteNullListAsEmpty,
        // 将 Boolean 类型的 null 转成 false
//        SerializerFeature.WriteNullBooleanAsFalse,
  // 避免循环引用
  SerializerFeature.DisableCircularReferenceDetect
 );
 converter.setFastJsonConfig(config);
 converter.setDefaultCharset(Charset.forName("UTF-8"));
 List<MediaType> mediaTypeList = new ArrayList<>();
 // 解决中文乱码问题,相当于在 Controller 上的 @RequestMapping 中加了个属性 produces = "application/json"
 mediaTypeList.add(MediaType.APPLICATION_JSON);
 converter.setSupportedMediaTypes(mediaTypeList);
 converters.add(converter);
 }
}

2. 拦截responsebody转json,对数据进行二次处理 (字典转换做案例)

2.1> 设置拦截器

import java.nio.charset.StandardCharsets;
import java.util.List;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import com.fintell.dp3.manager.interceptor.LogInterceptor;
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {
 @Override
 public void addInterceptors(InterceptorRegistry registry) {
 // 自定义拦截器,添加拦截路径和排除拦截路径
 registry.addInterceptor(getLogInterceptor()).addPathPatterns("/**");
 }
 @Bean
 public LogInterceptor getLogInterceptor() {
 return new LogInterceptor();
 }
 /**
 * 修改StringHttpMessageConverter默认配置 & Json 默认序列化方式 (改这个方法)
 */
 @Override
 public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
   //创建fastJson消息转换器
   FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
   //创建配置类
   FastJsonConfig fastJsonConfig = new FastJsonConfig();
   //修改配置返回内容的过滤
   fastJsonConfig.setSerializerFeatures(
       SerializerFeature.DisableCircularReferenceDetect,
       SerializerFeature.WriteMapNullValue,
       SerializerFeature.WriteNullStringAsEmpty
   );
   fastConverter.setFastJsonConfig(fastJsonConfig);
   //将fastjson添加到视图消息转换器列表内
   converters.add(fastConverter);
 }
}

2.2> 字典注解类

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Dict {
 String type();
}

2.3> 序列化类

import java.io.IOException;
import java.lang.reflect.Field;
import org.apache.commons.lang3.StringUtils;
import org.springframework.context.annotation.Configuration;
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 lombok.extern.slf4j.Slf4j;
@Slf4j
@Configuration
public class DictJsonSerializer extends JsonSerializer<Object> {
 @Override
  public void serialize(Object dictVal, JsonGenerator generator, SerializerProvider provider) throws IOException {
   ObjectMapper objectMapper = new ObjectMapper();
    String currentName = generator.getOutputContext().getCurrentName();
    try {
      // 1> 获取字段
      Field field = generator.getCurrentValue().getClass().getDeclaredField(currentName);
      // 2> 获取字典注解
      Dict dict = field.getDeclaredAnnotation(Dict.class);
      // 3> 判断是否添加了字典注解
      if(dict == null) {
       objectMapper.writeValue(generator, dictVal);
       return;
      }
      // 4> 获取注解的type值
      String type = dict.type();
      // **************** 以下依据实际业务处理即可 ********************
      // 5> 获取到字段的值
      String val = dictVal == null ? "" : dictVal.toString();
      String dictValName = "";
      if(!StringUtils.isEmpty(val)) {
        // 6> 这里可以依据type做不同的处理逻辑
       dictValName = "通过自己的方法,依据val获取到对应的字典值";
      }
      // 7> 将字段改写为{"code":"code","name":"name"}格式
      objectMapper.writeValue(generator, BaseEnum.builder().code(dictVal).name(dictValName.toString()).build());
    } catch (NoSuchFieldException e) {
     log.error(e);
    }
  }
}

2.4> 字典注解使用

@SuppressWarnings("serial")
@Builder
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class BizRuleDto implements Serializable{
  // 指定使用哪种序列化
  @JsonSerialize(using = DictJsonSerializer.class)
  // 指定字典 (将被转换为{"code":"content","name":"contentname"}格式)
  @Dict(type = "content")
 private String content;
}

3. 其它补充 (从容器中获取某个实例) : 如 DictJsonSerializer 需要通过service查询数据库获取字典

@Slf4j
public class DictJsonSerializer extends JsonSerializer<Object> {
  // service
 private static ProductProxy productProxy;
 static {
 productProxy = SpringUtils.getBean(ProductProxy.class);
 }
  @Override
  public void serialize(Object dictVal, JsonGenerator generator, SerializerProvider provider) throws IOException {
  }
}

SpringUtils

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class SpringUtils implements ApplicationContextAware {
 private static ApplicationContext ctx;
 /**
 * 获取bean
 */
 @SuppressWarnings("unchecked")
 public static <T> T getBean(String id) {
 return (T) ctx.getBean(id);
 }
 /**
 * 按类型获取bean
 */
 public static <T> T getBean(Class<T> clazz) {
 return ctx.getBean(clazz);
 }
 @Override
 public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
 ctx = applicationContext;
 }
}

到此这篇关于SpringBoot ResponseBody返回值处理的实现的文章就介绍到这了,更多相关SpringBoot ResponseBody返回值内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解SpringBoot定制@ResponseBody注解返回的Json格式

     1.引言 在SpringMVC的使用中,后端与前端的交互一般是使用Json格式进行数据传输,SpringMVC的@ResponseBody注解可以很好的帮助我们进行转换,但是后端返回数据给前端往往都有约定固定的格式,这时候我们在后端返回的时候都要组拼成固定的格式,每次重复的操作非常麻烦. 2.SpringMVC对@ResponseBody的处理 SpringMVC处理@ResponseBody注解声明的Controller是使用默认的.RequestResponseBodyMethodProc

  • SpringBoot使用@ResponseBody返回图片的实现

    以前使用HttpServletResponse可以通过输出流的方式来向前台输出图片.现在大部分都是使用springboot,在使用springboot之后,我们应该如何来修改代码呢? Spring Boot项目搭建配置略过,可直接从官网简历一个demo 首先写一个Controller类,包括一个方法,如下: package com.example.demo.common; import org.springframework.http.MediaType; import org.springfr

  • SpringBoot ResponseBody返回值处理的实现

    1. SpringBoot ResponseBody 返回值中null值处理 @PostMapping(path = "/test", produces = MediaType.APPLICATION_JSON_VALUE) public Object test() { JSONObject jsonObject = new JSONObject(); jsonObject.put("test","test"); jsonObject.put(&

  • 关于springboot的接口返回值统一标准格式

    目录 一.目标 二.为什么要对springboot的接口返回值统一标准格式? 第一种格式:response为String 第二种格式:response为Objct 第三种格式:response为void 第四种格式:response为异常 三.定义response的标准格式 四.初级程序员对response代码封装 步骤1:把标准格式转换为代码 步骤2:把状态码存在枚举类里面 步骤3:加一个体验类 五.高级程序员对response代码封装 步骤1:采用ResponseBodyAdvice技术来实

  • springboot中用fastjson处理返回值为null的属性值

    我们先来看代码: @Configuration public class WebMvcConfig extends WebMvcConfigurationSupport { public FastJsonHttpMessageConverter fastJsonHttpMessageConverter() { FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter()

  • spring通过filter,Interceptor统一处理ResponseBody的返回值操作

    项目中有一个需求,需要统一处理一下@ResponseBody注解的返回值(比如打印),在网上找了一下,有建议用AOP来做的,但是个人认为项目中用多个AOP并不优雅:通过google,找到了spring的ResponseBodyAdvice接口,用来对返回体做统一处理. 例如:统一打印返回体中的内容 @ControllerAdvice(basePackages = "cc.openwiki.controller.biz") public class LogResponseAdvice i

  • SpringBoot全局Controller返回值格式统一

    目录 一.返回值格式统一 1.返回值介绍 2.基础类功能 3.基础实现 二.附录说明 一.返回值格式统一 1.返回值介绍 在使用controller对外提供服务的时候,很多时候都需要统一返回值格式,例如 { "status": true, "message": null, "code": "200", "data": { "name": "json", "d

  • 解析springboot包装controller返回值问题

    1.springboot项目统一包装返回值,通常返回结果包含code.message.data,结构如下 import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor public class ResponseResult<T> { private int code; private Strin

  • springboot返回值转成JSONString的处理方式

    目录 返回值转成JSONString的处理 主要需求描述 解决方法 JSON.toJSONString 使用前提 使用 返回值转成JSONString的处理 主要需求描述 有些返回值中的null需要转换成“”或[],另外有些返回值需要把null给屏蔽掉. 解决方法 一(很lowb) 所有的返回值均采用string,在返回值之前,自己特殊处理成JSONString,然后返回给前端即可. 二(比较正统) 通过配置FastJsonConfig,配置类如下: @Configuration public

  • Feign接口方法返回值设置方式

    一.介绍 随着微服务的广泛应用,越来越多的企业都会使用微服务进行项目开发,在各个服务之间需要通过feign来进行通信,所以在feign调用接口中方法会接受其他服务接口不同类型返回值. 二.返回值设置 1.依据被调用服务接口设置相同返回类型 介绍:微服务A接口getUser 返回List<User>类型,微服务B通过feign调用方法也返回相同的结果类型. 特点:返回类型一一对应,在调用时不需要进行转化直接拿来就可以用. 缺点:扩展性不好,维护性不加. 解释:在目前springboot开发中,接

  • SpringBoot如何返回页面的实现方法

    SpringBoot中使用Controller和页面的结合能够很好地实现用户的功能及页面数据的传递.但是在返回页面的时候竟然会出现404或者500的错误,我总结了一下如何实现页面的返回以及这里面所包含的坑. SpringBoot中对Thymeleaf的集成已经基本完善,但在特殊情况下,并不需要或者不能使用Thymeleaf,所以分成两种情况对页面的返回进行阐述. 首先说一下这两种情况下都会发生的错误,也是新手们经常会出现的错误. 直接上代码: @RestController public cla

随机推荐