【问题标题】:Java Spring Boot FTPClient connection method from another class doesn´t work来自另一个类的 Java Spring Boot FTPClient 连接方法不起作用
【发布时间】:2020-04-22 19:31:51
【问题描述】:

我正在尝试创建一个额外的类来处理用户的连接和状态,但我仍然遇到一些奇怪的错误,我不明白。

这是我的 'FTPConnection 类 我使用 DI 创建了私有 ftpClient(我在主类中有 @Bean 注释),我正在尝试使用来自另一个类的此方法连接到服务器

@Autowired
private FTPClient ftpClient;

public void connect() {
    try {
        ftpClient.connect("host");
        ftpClient.login("username", "password");

        int reply = ftpClient.getReplyCode();

        if (!FTPReply.isPositiveCompletion(reply)) {
            ftpClient.disconnect();
            System.err.println("FTP server refused connection.");
            System.exit(1);
        }

    }
    catch (IOException ex) {
        System.out.println(ex.getMessage());
    }
}

这是具有 RequestMapping 方法的类

@PostMapping("/uploadFile")
    public void uploadFile(@RequestParam("file") MultipartFile file) {

        var connection = new FTPConnection();

        try {

            connection.connect();
            System.out.println(connection.isConnected());
            FTPClient ftpClient = connection.getFtpClient();

            ftpClient.changeWorkingDirectory("/usb");
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);

            [...]

我得到的错误是

Servlet.service() 用于路径 [] 上下文中的 servlet [dispatcherServlet] 引发异常 [请求处理失败;嵌套异常是 java.lang.NullPointerException] 与根 java.lang.NullPointerException:空 在 com.tenpetr.FTPFileUploader.FTPConnection.connect(FTPConnection.java:16) ~[main/:na] 在 com.tenpetr.FTPFileUploader.FileTransfer.uploadFile(FileTransfer.java:29) ~[main/:na] 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ...

你知道我为什么被困在这里吗?感谢您的建议。

【问题讨论】:

  • 请贴出FtpConnection构造函数的内容
  • @KompiKompi 这个类没有构造函数
  • 你的意思是它有一个空的默认值? ;)
  • @KompiKompi 完全正确:D
  • 能否请您将空构造函数添加到代码中并在此处放置一个断点,以便我们可以查看 FtpClient 是否已初始化? ftpClient 类广告构造函数长什么样子?

标签: java spring spring-boot dependency-injection


【解决方案1】:

我的猜测是(将在获得更多数据后更新)FtpClient 未正确初始化,因此 FtpConnection 也未正确初始化。

待更新

【讨论】:

  • 好吧,在设置了一些断点之后,看起来 FTPCLient 没有被初始化,这很奇怪,因为我在主类中有 Bean 注释,据我所知,它应该将它注入到字段中自动接线...
  • 能分享一下主要课程吗?你试过用@Component 注释 FtpClient 吗?
【解决方案2】:

使用单例范围定义 bean 意味着容器创建该 bean 的单个实例

编辑:

@Bean
@Scope("singleton")
    public FTPClient  ftpClient(){
        return new FTPClient();
    }

如果您尝试自动连接接口,这将不起作用

【讨论】:

  • 但是我不想每次我想重新连接时都创建新的 FTPClient 实例。这就是为什么我有这个 DI 逻辑。
  • 这毫无意义...为什么在连接方法中调用 new FTPClient() 时还要创建Bean public FTPClient ftpClient ...。这应该是单例对象。
  • 再次为您编辑
  • 不起作用,在 FTPConnection 类中自动装配时会变为空
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
  • 2017-01-29
  • 2021-07-24
  • 2019-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多