如何将XsltTransformer转换结果转字符串推送至Azure服务总线?Blob输出问题
解决XsltTransformer输出到Azure Blob无内容的问题
你的代码存在几个关键疏漏,导致Blob存储没有生成预期内容,以下是具体问题和修复方案:
核心问题及修复要点
- 流未关闭/刷新:
BlobOutputStream是带缓冲的输出流,转换完成后必须手动关闭或刷新,否则缓冲区数据不会写入Blob存储。 - 序列化器输出方法错误:要输出JSON,应将
Serializer.Property.METHOD设为json而非text,否则输出格式不符合预期,甚至可能导致内容丢失。 - 容器存在性验证:确保目标Blob容器已存在,否则写入操作会静默失败(部分SDK版本不会主动抛出异常)。
- 异常捕获缺失:未处理转换或IO过程中的异常,无法排查潜在错误。
修正后的代码示例
Serializer out = processor.newSerializer(); // 修正:输出方法改为json,匹配JSON转换需求 out.setOutputProperty(Serializer.Property.METHOD, "json"); out.setOutputProperty(Serializer.Property.INDENT, "yes"); BlobServiceClient blobServiceClient = new BlobServiceClientBuilder() .endpoint("https://xslttesting.blob.core.windows.net/sample") .credential(new DefaultAzureCredentialBuilder().build()) .buildClient(); BlobContainerClient blobContainerClient = blobServiceClient.getBlobContainerClient("sample"); // 确保容器存在,不存在则创建 blobContainerClient.createIfNotExists(); BlobClient blobClient = blobContainerClient.getBlobClient("sample.txt"); // 使用try-with-resources自动管理流的生命周期 try (BlobOutputStream blobOS = blobClient.getBlockBlobClient().getBlobOutputStream()) { out.setOutputStream(blobOS); XsltTransformer transformer = executable.load(); transformer.setInitialContextNode(source); transformer.setDestination(out); transformer.transform(); // 主动刷新序列化器,确保所有数据写入流 out.flush(); } catch (IOException | SaxonApiException e) { // 捕获并打印异常,便于排查问题 e.printStackTrace(); }
额外说明
- 若你的XSLT本身是生成JSON格式的文本,也可以保留
METHOD="text",但必须确保XSLT输出合法JSON,同时流的关闭/刷新步骤不能省略。 - 可先将输出临时转向控制台(
out.setOutputStream(System.out)),验证XSLT转换是否真的生成了内容,排除转换本身的问题。
内容的提问来源于stack exchange,提问作者preeti mallad
相关产品推荐
相关产品推荐

