添加Eureka Server依赖后出现JSON反序列化异常求助
从你给出的异常栈和依赖信息来看,核心问题是Jackson无法将字符串值'2D_2D_Pre_sd_sds'反序列化为JobGroup$Job对象——虽然该类已有构造方法,但缺少一个接受String参数的构造器/工厂方法来处理这种字符串输入的场景。
而添加spring-cloud-starter-netflix-eureka-server依赖后才触发这个问题,大概率是因为Spring Cloud引入的Jackson自动配置或版本变更,打破了之前项目中隐含的反序列化兼容逻辑。
具体解决步骤
1. 让Job类支持字符串转对象的反序列化
最直接的方式是给JobGroup$Job类添加字符串转换支持,有三种常用方案:
方案A:添加带String参数的构造方法
在内部类Job中新增构造方法,把字符串映射到对应的业务字段:
public static class Job { // 你的原有字段,比如name private String name; // 新增字符串参数构造方法 public Job(String jobName) { this.name = jobName; // 其他字段的初始化逻辑按需补充 } // 原有无参构造、getter/setter保持不变 }
方案B:用@JsonCreator标注工厂方法
如果不想修改构造方法,可以添加静态工厂方法并通过Jackson注解指定:
public static class Job { private String name; // 新增静态工厂方法 @JsonCreator public static Job fromString(String value) { Job job = new Job(); job.setName(value); return job; } // 原有代码保持不变 }
方案C:自定义反序列化器(复杂场景适用)
如果需要更灵活的转换逻辑,比如从字符串中解析多个字段,可以创建自定义反序列化器:
public class JobDeserializer extends StdDeserializer<Job> { public JobDeserializer() { super(Job.class); } @Override public Job deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { String jobStr = p.getValueAsString(); Job job = new Job(); // 这里可以根据业务逻辑拆分字符串,赋值给多个字段 job.setName(jobStr); return job; } }
然后在Job类上标注使用该反序列化器:
@JsonDeserialize(using = JobDeserializer.class) public static class Job { // 原有代码 }
2. 验证请求JSON格式是否匹配JobGroup结构
另一种可能是调用方传入的JSON格式不符合预期:比如JobGroup中的job字段定义为List<Job>,但实际传入的是字符串数组(如"job": ["2D_2D_Pre_sd_sds", ...]),而非Job对象数组(如"job": [{"name": "2D_2D_Pre_sd_sds"}, ...])。
如果是这种情况,要么修正传入的JSON格式,要么根据业务需求调整JobGroup的字段类型为List<String>。
3. 排查Jackson版本冲突
可以通过Maven命令查看依赖树,确认Jackson的版本是否统一:
mvn dependency:tree | grep jackson
如果发现多个版本的Jackson依赖,可以在spring-cloud-starter-netflix-eureka-server依赖中排除冲突模块,或者在dependencyManagement节点统一指定Jackson版本。
总结
优先尝试给Job类添加字符串转换的构造方法或注解,这是最快速的解决方式;其次确认请求JSON格式是否符合预期;最后排查依赖版本冲突。这些步骤应该能解决你遇到的问题。
内容的提问来源于stack exchange,提问作者Dhiren Solanki

