2017-08-30 1 views
0

Ich habe eine Web-Anwendung Java, die eine Datei von einem Netzlaufwerk zu lesen braucht. Es funktioniert perfekt, wenn ich es auf einem lokalen Host-Test-Server ausführen, wie ich angemeldet bin mit meinen Windows-Anmeldeinformationen. Es funktioniert jedoch nicht, wenn es auf einem Unternehmensserver bereitgestellt wird.Nullpointer, wenn neue SmbFileInput Schaffung

Ich habe versucht, einen Weg zu implementieren Benutzerdaten entlang zu schicken, wenn sie versuchen auf die Datei zuzugreifen, und mein aktueller Versuch wird mit The Java CIFS Client Library

ich meine Versuchen in this answer auf dem Code bin stützen, obwohl mein Code Bedürfnis aus einer Datei lesen statt auf eine schreiben. Ich bekomme eine NullpointerException, die ich nicht erklären kann.

Code:

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

Fehler:

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) 

Die Benutzerdaten werden akzeptiert. Ich habe sowohl gültige als auch ungültige Anmeldeinformationen ausprobiert, und die ungültigen geben Benutzeridentifikationsfehler.

Die Ausnahme wird ausgelöst, wenn die Input zu schaffen, die denken würde mich normalerweise machen, dass der Parameter sFile Objekt, null sein würde, oder ein null Feld haben. Ich weiß nicht, welches Feld das sein könnte. Debugging zeigt, dass isExists = true. Die URL ist ebenfalls gültig. Hier ist ein Screenshot von meinem sFile Objekt aus dem Debugger:

enter image description here

was ich hier fehlt? Warum bekomme ich eine Nullpointerexzeption?

Antwort

0

Nachdem ich den Quellcode durchlaufen hatte, stellte ich fest, dass die Variable unc die NullPointerException verursachte. Lange Rede kurzer Sinn, war mein Kampf von mir verursacht die Standard-URL-Mustern von smb nicht folgen, und die jCIFS Bibliothek versagt mir Informationen darüber zu geben. Die Regeln können found here (right after the initial import statements) lauten. Hier eine Auswahl:

SMB URL Examples

smb://users-nyc;miallen:[email protected]/tmp/
This URL references a share called tmp on the server angus as user miallen who's password is mypass.

smb://Administrator:P%[email protected]/c/WINDOWS/Desktop/foo.txt
A relativly sophisticated example that references a file msmith1's desktop as user Administrator. Notice the '@' is URL encoded with the '%40' hexcode escape.

smb://angus/
This references only a server. The behavior of some methods is different in this context(e.g. you cannot delete a server) however as you might expect the list method will list the available shares on this server.

smb://myworkgroup/
This syntactically is identical to the above example. However if myworkgroup happends to be a workgroup(which is indeed suggested by the name) the list method will return a list of servers that have registered themselves as members of myworkgroup.

smb:// Just as smb://server/ lists shares and smb://workgroup/ lists servers, the smb:// URL lists all available workgroups on a netbios LAN. Again, in this context many methods are not valid and return default values(e.g. isHidden will always return false).

smb://angus.foo.net/d/jcifs/pipes.doc
The server name may also be a DNS name as it is in this example. See Setting Name Resolution Properties for details.

smb://192.168.1.15/ADMIN$/
The server name may also be an IP address. See Setting Name Resolution Properties for details.

smb://domain;username:[email protected]/share/path/to/file.txt
A prototypical example that uses all the fields.

smb://myworkgroup/angus/ <-- ILLEGAL
Despite the hierarchial relationship between workgroups, servers, and filesystems this example is not valid.

smb://server/share/path/to/dir <-- ILLEGAL
URLs that represent workgroups, servers, shares, or directories require a trailing slash '/'.

smb://MYGROUP/?SERVER=192.168.10.15
SMB URLs support some query string parameters. In this example the SERVER parameter is used to override the server name service lookup to contact the server 192.168.10.15 (presumably known to be a master browser) for the server list in workgroup MYGROUP.

Verwandte Themen