
hoverfly java 中间件需确保返回 json 中数值字段(如 status)为原始整数类型而非字符串,否则 go 端反序列化会因类型不匹配(string → int)而报错“cannot unmarshal string into go value of type int”。
hoverfly java 中间件需确保返回 json 中数值字段(如 status)为原始整数类型而非字符串,否则 go 端反序列化会因类型不匹配(string → int)而报错“cannot unmarshal string into go value of type int”。
在使用 Hoverfly 的 --middleware 功能时,Go 主进程(Hoverfly)会将请求/响应数据以标准 JSON 格式通过 stdin 传入外部中间件,并期望中间件从 stdout 返回严格符合其结构定义的 JSON。关键点在于:Hoverfly 内部使用 Go 的 json.Unmarshal 解析返回体,其数据结构中 status 字段被定义为 int 类型(见 Hoverfly 源码),因此若中间件输出 "status": "500"(字符串),Go 将无法将其转换为 int,直接触发 json: cannot unmarshal string into Go value of type int 错误。
? 问题定位与修复
原 Java 代码中:
response.put("status", "500"); // ❌ 错误:传入字符串字面量应改为:
response.put("status", 500); // ✅ 正确:传入整数字面量(自动装箱为 Integer)✅ 完整修正后的 Java 中间件示例
import java.util.Scanner;
import org.json.JSONObject;
public class Middleware {
public static void main(String[] args) {
try (Scanner scanner = new Scanner(System.in)) {
// 读取单行 JSON 输入(Hoverfly 保证每调用一次只传入一个完整 JSON 对象)
String payload = scanner.nextLine().trim();
if (payload.isEmpty()) {
System.err.println("Empty input received");
return;
}
JSONObject root = new JSONObject(payload);
JSONObject response = root.getJSONObject("response");
// ✅ 关键修复:status 必须为整数类型,不可为字符串
response.remove("status");
response.put("status", 500); // ← 注意:此处是 int,不是 "500"
// 可选:其他字段修改(保持类型一致,如 status_code、delay 等也应为 number)
// response.put("status", 500).put("delay", 100);
// 直接输出到 stdout —— Hoverfly 从此读取结果
System.out.print(root.toString());
} catch (Exception e) {
e.printStackTrace();
// ⚠️ 注意:异常堆栈会输出到 stderr,但 Hoverfly 只读取 stdout;错误应尽量避免,或返回合法错误 JSON
}
}
}⚠️ 重要注意事项
- 不要使用 System.out.print(obj) 后再 write(newjson):原代码同时调用 write(...)(写文件)和 System.out.print(obj),会导致 stdout 输出混乱(可能含换行、空格或重复内容),Hoverfly 仅解析第一个有效 JSON,多余输出将破坏 JSON 结构。
- 避免额外换行或空格:System.out.print(...) 优于 println(...);确保输出是紧凑、无 BOM、单个合法 JSON 对象。
- encodedBody 字段类型需一致:若修改 encodedBody,务必保持其为 boolean(如 response.put("encodedBody", false)),不可传 "false" 字符串。
- 输入可靠性:Hoverfly 默认按行传递 JSON,但需确保 Java 不因缓冲或编码问题截断长 body(本例中 XML body 较长,建议使用 scanner.useDelimiter("\A") 或 InputStreamReader + BufferedReader 处理超长输入,不过 nextLine() 在大多数场景下已足够)。
-
构建与运行:确保 JAR 包包含 org.json 依赖(如 json-20231013.jar),并正确打包主类(MANIFEST.MF 中指定 Main-Class: Middleware):
jar -cfm mid.jar MANIFEST.MF *.class json-20231013.jar ./hoverfly -middleware "java -jar mid.jar"
✅ 验证方式
启动 Hoverfly 后发起请求,观察日志是否不再出现 Failed to unmarshal JSON 错误;同时检查响应状态码是否真实变为 500(可通过 curl -v http://localhost:8500/your-path 验证 HTTP 状态及 body)。
遵循以上规范,即可彻底解决 Go 与 Java 中间件间因 JSON 类型契约不一致引发的反序列化失败问题。


















