我正在尝试使用Jsch库将本地创建的XML文件(使用JAXB从Java对象编组)传输到远程服务器。但是,该文件仅部分上传。它缺少结尾标记,结尾缺少任意数量的字符。

我的代码如下所示(TradeLimits是一个带有JAXB注释的Java类)

TradeLimits limits = getTradeLimits(); //complex object with many fields
JSch jsch = new JSch();
jschSession = jsch.getSession(username, remoteHost);

//to avoid unknown host issues
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
jschSession.setConfig(config);

jschSession.setPassword(password);
jschSession.setPort(22);
jschSession.connect();

ChannelSftp channelSftp = (ChannelSftp) jschSession.openChannel("sftp");
channelSftp.connect();

jaxbContext = JAXBContext.newInstance(TradeLimits.class);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); //for pretty print
marshaller.marshal(limits, channelSftp.put(limitUploadPathString)); //this uploads only partial xml file to sftp server
marshaller.marshal(limits, System.err)); //THIS WORKS CORRECTLY AND THE FULL XML IS PRINTED!

channelSftp.disconnect();
channelSftp.exit();


请注意,这不可能是JAXB问题,因为它将在其他位置打印完整的XML,而只有部分XML被上载到远程服务器。可能是什么问题?提前致谢!

最佳答案

写入完毕后,请务必确保刷新/关闭OutputStream。

try(OutputSteam fileStream = channelSftp.put(limitUploadPathString)) {
  marshaller.marshal(limits, fileStream);
}

07-26 03:58