解决bug:HttpMessageNotReadableException: JSON parse error: java.lang.Object is not an enum type

博客围绕swagger模拟前端请求时枚举和JavaBean识别问题展开。通过简单DEMO测试发现普通枚举类入参可解析,复杂嵌套则不行。查询资料后使用@JSONType和@JsonFormat注解解决,经思考测试,发现仅@JsonFormat注解即可,问题或因json反序列化配置规则改变。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

完整的问题如下:

swagger模拟前端请求的json格式为:

{
  "enabled": true,
  "identification": "string",
  "name": "string",
  "onwerRoleGroups": [
    null
  ],
  "parentId": 0,
  "remark": "string",
  "roleCategory": "NORMAL",
  "root": true,
  "text": "string",
  "totalResources": [
    {
      "enabled": true,
      "id": 0,
      "operations": [
        "RETRIEVE"
      ],
      "permissionModule": {
        "enabled": true,
        "identification": "string",
        "menu": true,
        "name": "string",
        "ownerType": "ROLE",
        "parentId": 0,
        "rank": 0,
        "remark": "string",
        "root": true,
        "uris": [
          "string"
        ]
      },
      "rank": 0
    }
  ]
}

问题出在:

"operations": [
        "RETRIEVE"
      ]

详细的报错为:

— Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: java.lang.Object is not an enum type; nested exception is com.fasterxml.jackson.databind.JsonMappingException: java.lang.Object is not an enum type (through reference chain: cn.ffcs.videoapp.web.security.permission.entity.PermissionRole[“totalResources”]->java.util.HashSet[0]->cn.ffcs.videoapp.web.security.permission.entity.PermissionResource[“operations”]->java.util.HashSet[0])]
分析的话应该是枚举和javabean识别的问题
先做一个简单的DEMO测试一下
下面的代码是controller

    @ApiOperation("呵呵")
    @PostMapping("/aaa")
    public String addRole1(@RequestBody Person2 person2) {
        Set<Sex> sexs = person2.getSexs();
        System.out.println(person2.getName());
        for (Sex sex : sexs) {
            System.out.println(sex.getText());
        }
        return "ok";
    }

下面的封装一个javabean,里面一个字段是Set<枚举>

public class Person2 {
    private Set<Sex> sexs=new HashSet<>(0);
    private String name;

    public Set<Sex> getSexs() {
        return sexs;
    }

    public void setSexs(Set<Sex> sexs) {
        this.sexs = sexs;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

这个是枚举

public enum Sex {
    MAN("男"),WOMAN("女");

    private String text;

    Sex(String text) {
        this.text = text;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public static void main(String[] args) {
        System.out.println(Sex.MAN.getText());
    }
}

swagger里面的json是:

{
  "name": "string",
  "sexs": [
    "MAN"
  ]
}

结果可以显示
在这里插入图片描述
结论是:普通的枚举类可以通过
"字段":[“枚举的属性1”,“枚举的属性2”]
入参给controller并进行解析
但是同样的写法.复杂嵌套的java里面套java再套枚举就不行
在网上查询资料:
https://blog.youkuaiyun.com/zhangfengaiCQ/article/details/82657926#commentBox
再枚举上加上注解
@JSONType(serializeEnumAsJavaBean = true)
(import com.alibaba.fastjson.annotation.JSONType;)
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
(import com.fasterxml.jackson.annotation.JsonFormat;)
然后再枚举类上加上这两个注解,发现就可以了

找一下为什么

@JSONType(serializeEnumAsJavaBean = true)
作用:配置enum的序列化,可以加在类上,也可以在SerializeConfig 里面配置
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
作用:
(1)@JsonFormat 用来表示json序列化的一种格式或者类型,主要有下面几个常用的属性
shape: 表示序列化后的一种类型

pattern: 表示日期的格式

timezone: 默认是GMT,中国需要GMT+8

locale: 根据位置序列化的一种格式
(2)可用于controller返回给前端responsebody的时候把枚举转换为Object

参考资料

https://segmentfault.com/q/1010000006935643?_ea=1182544
https://blog.youkuaiyun.com/u012326462/article/details/83019681
https://blog.youkuaiyun.com/zhangfengaiCQ/article/details/82657926#commentBox

思考测试了下.好像有点不对

@JSONType(serializeEnumAsJavaBean = true)好像是没用的
只要@JsonFormat(shape = JsonFormat.Shape.OBJECT)就可以了
本项目之前用的枚举类继承了的类里面已经加了@JsonFormat(shape = JsonFormat.Shape.OBJECT)
本来是可以了.
继承的类上加了

@JsonDeserialize(
    using = OptionEnumAwareDeserializer.class
)
@JsonFormat(
    shape = Shape.OBJECT
)
public class OptionEnumAwareDeserializer extends JsonDeserializer<OptionEnumAware>

估计改变了json的反序列化的配置规则,所以导致错误
这里序列化指 对象转json字符串
反序列化指string的json转对象
具体还是要去json反序列化配置里面去改

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值