美文网首页
让springboot序列化空值null为"null"而不是空报

让springboot序列化空值null为"null"而不是空报

作者: rainmanhhh | 来源:发表于2020-08-19 17:21 被阅读0次

springboot以@RestController@ResponseBody注解自动处理的接口会将方法返回的对象序列化为json字符串返回给前端,但是默认情况下,如果返回的对象为null,并不会进行json序列化,而是返回空报文体
如果前端使用类似fetch的json()方法这种严格校验json格式的方式获取数据,遇到空报文体就会报错
解决办法:

  • 首先定义一个单例对象用于表示这种需要json序列化的null值
@JsonSerialize(using = NullSerializer::class)
object JsonNull
  • 然后为springboot注册一个controller advice,专门用于处理json接口返回null的情况(如果值非null,则原封不动直接返回,框架会交给下一个advice处理)
@ControllerAdvice
class JsonNullBodyAdvice : ResponseBodyAdvice<Any?> {
  override fun supports(returnType: MethodParameter, converterType: Class<out HttpMessageConverter<*>>): Boolean {
    return AbstractJackson2HttpMessageConverter::class.java.isAssignableFrom(converterType)
  }

  override fun beforeBodyWrite(
    body: Any?, returnType: MethodParameter, contentType: MediaType,
    converterType: Class<out HttpMessageConverter<*>>, request: ServerHttpRequest, response: ServerHttpResponse
  ): Any? {
    return body ?: JsonNull
  }
}

这里之所以需要用一个占位的对象来代替null本身,是因为AbstractMessageConverterMethodProcessor中对所有advice(包括默认的)预处理完的body进行了判断,如果为null,跳过序列化,直接返回空报文体给客户端,改为使用占位对象后,则可以进入jackson的序列化逻辑中,通过注解判断使用NullSerializer向客户端回写合法的json字符串"null"(不包括引号)

相关文章

  • 让springboot序列化空值null为"null"而不是空报

    springboot以@RestController或@ResponseBody注解自动处理的接口会将方法返回的对...

  • 接口设计细节

    1、list返回值,如果为空,返回空数组,而不是null; 2、get返回值,如果为空,返回null;

  • MYSQL-空值与非空

    NULL 字段值可以为空 NOT NULL 字段值禁止为空

  • 1-5空类型和智能类型转换

    空类型安全问题判断值是否为空,如果为空,则直接返回空,否则,返回相应值 null类型 声明可null类型但本身不为...

  • mysql 字段长度

    一、数字类型 辨別Null与Not Null :Null为允许储存空值(Null) 二、数值 辨別ZeroFill...

  • sql中NULL与空的区别

    空值不占空间,NULL值占空间。当字段不为NULL时,也可以插入空值。 当使用IS NOT NULL 或者IS N...

  • java8 Stream Collectors.toMap 引发

    NullPointerException v 为null,报空指针错误 k为null, 运行正常。 以往的认知:H...

  • steam map问题

    NullPointerException v 为null,报空指针错误 k为null, 运行正常。 以往的认知:H...

  • 2-10 空值与非空

    NULL,字段值可以为空,默认。NOT NULL,字段值不能为空。 正确:INSERT users VALUES(...

  • mongodb命令

    常用命令 注意:空值是null(小写),NULL和Null都不行;Mongo的可空类型是Null; 聚合命令 增删...

网友评论

      本文标题:让springboot序列化空值null为"null"而不是空报

      本文链接:https://www.haomeiwen.com/subject/meldjktx.html