Spring Boot Restful项目中无法从字符串值反序列化问题求助
解决Spring Boot中JSON解析无法构造Protocol实例的问题
这个问题我之前也碰到过,本质是Jackson在把JSON请求体反序列化成Protocol对象的时候,找不到合适的方式创建实例,下面给你几个靠谱的解决办法:
1. 给Protocol类添加无参构造器
Hibernate和Jackson都依赖无参构造器来实例化对象,这是最常见的解决方式。你只需要在Protocol类里加上一个空的构造方法就行:
public class Protocol { // 你的实体字段 private Long id; private String protocolName; // 必须添加的无参构造器 public Protocol() { } // 带参构造器(如果业务需要可以保留) public Protocol(Long id, String protocolName) { this.id = id; this.protocolName = protocolName; } // 所有字段的getter和setter方法也不能少 public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getProtocolName() { return protocolName; } public void setProtocolName(String protocolName) { this.protocolName = protocolName; } }
2. 用@JsonCreator注解指定构造器(如果不想用无参构造器)
如果你的业务场景不允许用无参构造器,那可以给带参构造器加上@JsonCreator注解,同时用@JsonProperty标注每个参数对应的JSON字段名:
public class Protocol { private Long id; private String protocolName; @JsonCreator public Protocol(@JsonProperty("id") Long id, @JsonProperty("protocolName") String protocolName) { this.id = id; this.protocolName = protocolName; } // getter和setter方法仍然需要 }
3. 检查JSON请求体的字段匹配度
确保前端发送的JSON字段名和Protocol类的属性名完全一致(Jackson默认大小写敏感),比如如果你的类里属性是protocolName,前端就不能写成protocolname或者name。举个正确的请求体例子:
{ "id": 1, "protocolName": "TCP/IP" }
4. 确认字段都有对应的getter和setter
Jackson需要通过getter和setter来访问和设置对象属性,哪怕你用了构造器,也建议给所有需要反序列化的字段加上对应的getter和setter方法,避免出现其他序列化问题。
如果Protocol是枚举类的话,那还要额外处理:你需要确保JSON里的值是枚举的name或者ordinal,或者给枚举类加上@JsonValue注解指定序列化的字段,比如:
public enum Protocol { HTTP("HTTP"), TCP("TCP"); private String value; Protocol(String value) { this.value = value; } @JsonValue public String getValue() { return value; } }
内容的提问来源于stack exchange,提问作者dumi7ru
相关产品推荐
相关产品推荐

