繁体   English   中英

创建新的SmbFileInput时发生NullpointerException

[英]NullpointerException when creating new SmbFileInput

我有一个Java Web应用程序,它需要从网络驱动器读取文件。 当我在localhost测试服务器上运行它时,它可以完美运行,因为我使用Windows凭据登录。 但是,当在公司服务器上部署时,它不起作用。

我一直在尝试实现一种在尝试访问文件时发送用户凭证的方式,而我目前的尝试是使用Java CIFS客户端库

尽管我的代码需要从文件中读取而不是写入文件,但我还是基于此答案中的代码。 我收到无法解释的NullpointerException。

码:

public static void main(String[] args) {

    String filePath = "[myPath]";
    String USER = "domain;username:password";

    try {

        NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(USER);
        SmbFile sFile = new SmbFile(filePath, auth);        
        if(sFile.exists()){
            InputStream stream = new SmbFileInputStream(sFile); //throws exception
        }

    } catch (SmbException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

错误:

Exception in thread "main" java.lang.NullPointerException
    at jcifs.smb.ServerMessageBlock.writeString(ServerMessageBlock.java:213)
    at jcifs.smb.ServerMessageBlock.writeString(ServerMessageBlock.java:202)
    at jcifs.smb.SmbComNTCreateAndX.writeBytesWireFormat(SmbComNTCreateAndX.java:170)
    at jcifs.smb.AndXServerMessageBlock.writeAndXWireFormat(AndXServerMessageBlock.java:101)
    at jcifs.smb.AndXServerMessageBlock.encode(AndXServerMessageBlock.java:65)
    at jcifs.smb.SmbTransport.doSend(SmbTransport.java:439)
    at jcifs.util.transport.Transport.sendrecv(Transport.java:67)
    at jcifs.smb.SmbTransport.send(SmbTransport.java:655)
    at jcifs.smb.SmbSession.send(SmbSession.java:238)
    at jcifs.smb.SmbTree.send(SmbTree.java:119)
    at jcifs.smb.SmbFile.send(SmbFile.java:775)
    at jcifs.smb.SmbFile.open0(SmbFile.java:989)
    at jcifs.smb.SmbFile.open(SmbFile.java:1006)
    at jcifs.smb.SmbFileInputStream.<init>(SmbFileInputStream.java:73)
    at jcifs.smb.SmbFileInputStream.<init>(SmbFileInputStream.java:65)
    at Test.main(Test.java:45)

接受用户凭据。 我已经尝试过使用有效和无效的凭据,而无效的凭据会给用户标识错误。

创建inputstream时会抛出异常,通常会使我认为参数sFile对象为null或具有null字段。 我不知道这可能是哪个领域。 调试显示isExists = true 该URL也有效。 这是调试器中我的sFile对象的屏幕截图:

在此处输入图片说明

我在这里想念什么? 为什么我会得到一个nullpointerexception?

遍历源代码后,我发现unc变量是导致NullPointerException变量。 长话短说,我的挣扎是由于我没有遵循smb的标准url模式引起的,并且jcifs库无法提供有关此信息。 可以在此处找到这些规则(在初始import语句之后) 这是一个选择:

SMB URL示例

smb://users-nyc;miallen:mypass@angus/tmp/
该URL引用了服务器angus上名为tmp的共享,密码为mypass,用户为miallen。

smb://Administrator:P%40ss@msmith1/c/WINDOWS/Desktop/foo.txt
相对复杂的示例,以用户Administrator的身份引用文件msmith1的桌面。 注意,“ @”是使用“%40”十六进制转义符编码的URL。

smb://angus/
这仅引用服务器。 在这种情况下,某些方法的行为有所不同(例如,您无法删除服务器),但是您可能希望list方法将列出此服务器上的可用共享。

smb://myworkgroup/
从句法上讲,这与上面的示例相同。 但是,如果myworkgroup恰好是一个工作组(确实由名称建议),则list方法将返回已将自身注册为myworkgroup成员的服务器的列表。

smb://就像smb://server/列出共享并且smb://workgroup/列出服务器一样,smb:// URL列出了netbios LAN上的所有可用工作组。 同样,在这种情况下,许多方法都是无效的,并且会返回默认值(例如isHidden将始终返回false)。

smb://angus.foo.net/d/jcifs/pipes.doc
在此示例中,服务器名称也可以是DNS名称。 有关详细信息,请参见设置名称解析属性。

smb://192.168.1.15/ADMIN$/
服务器名称也可以是IP地址。 有关详细信息,请参见设置名称解析属性。

smb://domain;username:password@server/share/path/to/file.txt
一个使用所有字段的典型示例。

smb://myworkgroup/angus/ <-非法
尽管工作组,服务器和文件系统之间存在层次关系,但此示例无效。

smb://server/share/path/to/dir <-非法
代表工作组,服务器,共享或目录的URL需使用斜杠“ /”。

smb://MYGROUP/?SERVER=192.168.10.15
SMB URL支持一些查询字符串参数。 在此示例中,SERVER参数用于覆盖服务器名称服务查找,以联系服务器192.168.10.15(假定是主浏览器)以获取工作组MYGROUP中的服务器列表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM