雾计算架构中调用REST接口检查用户存在性触发404 null异常
问题分析与解决方案:RestTemplate调用抛出HttpClientErrorException(404 null)
我之前碰到过几乎一模一样的RestTemplate调用坑,结合你这个雾计算架构的场景,咱们来理清楚整个问题的来龙去脉和解决办法:
场景回顾
你正在搭建的雾计算架构中:
- 云端部署了2台负责数据库交互的服务器
- 客户端-服务端应用的服务端作为雾端服务器
- 在用户注册验证阶段,调用REST接口检查用户是否存在时出现
404 null异常:直接访问http://localhost:8081/user/test能正常返回用户JSON,但用RestTemplate调用就抛出HttpClientErrorException,最终定位到是User类构造器错误导致的。
为什么直接调用正常,RestTemplate就报错?
直接通过浏览器/Postman访问接口正常,说明接口的业务逻辑、数据库交互完全没问题——问题出在RestTemplate的响应反序列化环节。
当RestTemplate拿到接口返回的JSON后,需要把它转换成User对象,但如果User类的构造器不满足Jackson(Spring默认JSON处理工具)的要求,就会反序列化失败,框架会把这个失败伪装成404 null的异常返回,很容易误导人以为是接口找不到。
构造器到底哪里错了?
Jackson反序列化JSON到对象时,必须满足以下条件之一:
- 类存在无参构造器:Jackson需要先通过无参构造器创建空对象,再逐个给属性赋值
- 如果用有参构造器,必须给构造器的每个参数添加
@JsonProperty注解,明确对应JSON里的字段名;或者用Lombok的@AllArgsConstructor+@NoArgsConstructor确保无参构造器存在
如果你的User类只有有参构造器,且没做上述处理,RestTemplate根本没法创建User对象,自然就抛出异常了。
修复方案
方案1:手动添加无参构造器
给User类补上无参构造器,同时保留你需要的有参构造器:
public class User { private String username; private String email; // 必须的无参构造器 public User() {} // 业务需要的有参构造器 public User(String username, String email) { this.username = username; this.email = email; } // 别忘了getter和setter方法 public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
方案2:用Lombok简化代码
如果项目里已经引入Lombok,直接给User类加这三个注解,一键生成无参/全参构造器、getter/setter等:
import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor public class User { private String username; private String email; }
验证修复
调整完User类后,再用RestTemplate调用接口,就能正常把JSON转换成User对象,不会再出现404 null的异常了。
内容的提问来源于stack exchange,提问作者Rafał Sokalski
相关产品推荐
相关产品推荐

