почему мой оператор возврата возвращает нулевой результат? - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь подключиться к удаленному компьютеру и отобразить некоторые файлы из определенного каталога.

Проблема в том, что когда я проверяю свою функцию, она возвращает нулевой результат, и я хочу отобразить имена файлов.

Вот мой код:

@Service
public class SftpClientImpl implements SftpClient {


    private LsEntry entry;

    @Override
    public LsEntry connectToServer() {
             String  SFTPHOST = "xxxxx";
             int   SFTPPORT = 22;
             String  SFTPUSER = "xxx";
             String  SFTPPASS = "xxxxx";
             String SFTPWORKINGDIR = "/dir/dir2/dir3";

            Session session = null;
            Channel channel = null;
            ChannelSftp channelSftp = null;

            try{
                JSch jsch = new JSch();
                session = jsch.getSession(SFTPUSER,SFTPHOST,SFTPPORT);
                session.setPassword(SFTPPASS);
                java.util.Properties config = new java.util.Properties();
                config.put("StrictHostKeyChecking", "no");
                session.setConfig(config);
                session.connect();
                channel = session.openChannel("sftp");
                channel.connect();
                System.out.println("Starting the session ..");
                channelSftp = (ChannelSftp)channel;
                channelSftp.cd(SFTPWORKINGDIR);
                Vector filelist = channelSftp.ls(SFTPWORKINGDIR);
                for(int i=0; i<filelist.size();i++){
                    LsEntry entry = (LsEntry) filelist.get(i);
                    System.out.println(entry.getFilename());
                }
                while(session != null){
                    System.out.println("Killing the session");
                    session.disconnect();
                    System.exit(0);
                }

            }catch(Exception ex){
                ex.printStackTrace();
            }
            return entry;
        } 
}

и

@GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<LsEntry> getDirectories() {
        LsEntry entry = sftpClient.connectToServer();
        return new ResponseEntity<>(entry, HttpStatus.OK);
    }

Есть идеи, почему это не работает?

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

вот так я решил свою проблему :) Я исправил объявление переменной, и оно работало хорошо, как вы мне сказали :) спасибо

@Override
public LsEntry connectToServer() {
    String HOST = "xxxxx";
         int  PORT = 22;
         String  USER = "xxx";
         String  PASS = "xxxxx";
         String DIR = "/dir/dir2/dir3";

    Session session = null;
    Channel channel = null;
    ChannelSftp channelSftp = null;
    // LsEntry declaration 
    LsEntry entry = null;
    try {
        JSch jsch = new JSch();
        session = jsch.getSession(USER, HOST, PORT);
        session.setPassword(PASS);
        // the rest of the code
        //....
        //...
        for (int i = 0; i < filelist.size(); i++) {
            //cast
            entry = (LsEntry) filelist.get(i);
            System.out.println(((LsEntry) entry).getFilename());
        }
        while (session != null) {
            System.out.println("Killing the session");
            session.disconnect();
            System.exit(0);
        }

    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return (LsEntry) entry;
}
0 голосов
/ 03 мая 2018

entry равно нулю, поскольку его значение содержится только в цикле for и фактически объявляется дважды (один раз с областью частного класса, один раз с локальной областью внутри цикла for).

Я предлагаю исправить объявление переменных и проверить подключение и печать имени файла. Если это все еще не работает, попробуйте это в известной конечной точке рабочей пружины. Если он распечатывает каталог должным образом, перейдите к своей конечной точке и повторите попытку. Это поможет сузить сферу вашей проблемы.

Я использовал приведенный ниже код для подключения и печати имен файлов в течение последних нескольких лет, и он в значительной степени основан на примере кода, предоставленного JSCH в то время:

  JSch jsch = new JSch();
  Session session;

  session = jsch.getSession(username, hostname, port);
  session.setConfig("StrictHostKeyChecking", "no");
  session.setPassword(password);
  session.connect();

  Channel channel = session.openChannel("sftp");
  channel.connect();
  ChannelSftp sftpChannel = (ChannelSftp) channel;

   //List our files within the directory
   Vector vv = sftpChannel.ls(srcDir);
   if (vv != null) {
       LOGGER.debug("We have a file listing!");
       for (int ii = 0; ii < vv.size(); ii++) {
           Object obj = vv.elementAt(ii);
           if (obj instanceof ChannelSftp.LsEntry) {
               LOGGER.debug("[" + ((ChannelSftp.LsEntry) obj).getFilename() + "]");

               if (ii < 1) { // empty directory contains entries for . and ..
                   continue;
               }

               String filename = ((ChannelSftp.LsEntry) obj).getFilename();
               filenames.add(filename);
               LOGGER.debug("filename is: {}", filename);
               ....
...