如何在Citrus框架中接收HTTP Post返回的PDF并写入文件?
问题分析与解决方案
你的问题不是字符编码问题,而是完全错误地使用了ObjectOutputStream处理PDF二进制数据。ObjectOutputStream的作用是序列化Java对象(附带对象类型等元数据),而非直接提取原始二进制内容,这才导致写入文件后内容为空或无效。
错误原因
Citrus框架接收application/pdf类型响应时,返回的payload本身就是原始二进制数据,通常是byte[]或InputStream类型。你用ObjectOutputStream.writeObject()会把对象的序列化信息(而非原始PDF字节)写入流中,最终得到的不是有效的PDF内容。
正确处理步骤
1. 确认Payload的实际类型
先打印payload的类型,明确Citrus返回的载体类型:
System.out.println(pdfPayload.getClass().getName());
2. 根据类型提取二进制数据
- 如果是
byte[]类型:直接强转即可,无需额外处理
byte[] pdfBytes = (byte[]) pdfPayload;
- 如果是
InputStream类型:将输入流转换为字节数组
byte[] pdfBytes; // 使用try-with-resources自动关闭流 try (InputStream pdfInputStream = (InputStream) pdfPayload; ByteArrayOutputStream bos = new ByteArrayOutputStream()) { byte[] buffer = new byte[1024]; int readLen; while ((readLen = pdfInputStream.read(buffer)) != -1) { bos.write(buffer, 0, readLen); } pdfBytes = bos.toByteArray(); } catch (IOException e) { throw new RuntimeException("读取PDF流失败", e); }
3. 优化Citrus接收配置(可选但推荐)
在Citrus的接收配置中显式指定二进制payload,确保框架正确处理二进制数据:
runner.http(httpActionBuilder -> httpActionBuilder .client(vdeClient) .receive() .response(HttpStatus.OK) .contentType(MediaType.APPLICATION_PDF_VALUE) .binaryPayload(true) // 标记为二进制内容,避免框架做不必要的字符转换 );
写入文件示例
拿到正确的pdfBytes后,写入文件:
try (FileOutputStream fos = new FileOutputStream("output.pdf")) { fos.write(pdfBytes); } catch (IOException e) { e.printStackTrace(); }
内容的提问来源于stack exchange,提问作者Rems
相关产品推荐
相关产品推荐

