Próbuję użyć biblioteki Jsch do przesłania lokalnie utworzonego pliku XML (kierowanego z obiektu Java przy użyciu JAXB) do zdalnego serwera. Jednak plik zostanie przesłany tylko częściowo. Brakuje tagu końcowego i dowolnej liczby znaków na końcu.

Mój kod wygląda następująco (TradeLimits to klasa Java z adnotacjami JAXB)

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();

Zwróć uwagę, że nie może to być problem JAXB, ponieważ w innym miejscu wydrukuje pełny kod XML, ale tylko jego część zostanie przesłana na serwer zdalny. Co może być problemem? Z góry dziękuję!

0
Stan Ostrovskii 8 styczeń 2020, 23:24

1 odpowiedź

Najlepsza odpowiedź

Zawsze upewnij się, że opróżniłeś / zamknąłeś OutputStream, kiedy skończysz do niego pisać.

try(OutputSteam fileStream = channelSftp.put(limitUploadPathString)) {
  marshaller.marshal(limits, fileStream);
}
2
jtahlborn 8 styczeń 2020, 20:29