java.lang.ClassCastException: [B kann nicht in java.lang.String umgewandelt werden

8
%Vor%

Ausnahme

%Vor%     
theJava 11.01.2011, 08:46
quelle

3 Antworten

6

Scheint, dass die Kennwortspalte Ihrer Datenbank ein Typ ist, der als String in Java zugeordnet ist (höchstwahrscheinlich varchar ). So kann Hibernate Ihr Byte array nicht in ein String konvertieren.

Sie können Ihre Zeilen so ändern:

%Vor%

Aber es wird wahrscheinlich nicht funktionieren, da der Digest höchstwahrscheinlich Bytes enthalten wird, die chars nicht zugeordnet werden können, unabhängig von der Codierung. Sie sollten wahrscheinlich eine base64-Codierung verwenden, um Sie zuzuordnen binäres Blob zu einem String.

Eine andere Lösung besteht darin, Ihr Datenbankschema zu ändern und das password -Feld zu einem binären anstatt zu einem varchar zu machen.

In beiden Fällen müssen Sie wissen, wie das Feld password in die Datenbank eingefügt wird.

Einige Anmerkungen zu Ihrem Code:

Ich finde es seltsam, dass Sie das Passwort überprüfen, indem Sie eine Zeile aus Ihrer Datenbank mit dem Benutzernamen und dem Passwort auswählen. Ich wäre logischer, wenn ich nur den Benutzer auswähle und dann das angegebene Passwort gegen das in der Datenbank zurückgegebene validiere.

Sie verwenden eine Hash-Funktion, um sicherzustellen, dass Ihr Passwort nicht in Klartext in der Datenbank gespeichert wird. Das ist gut. Ihr Schema hat jedoch einen großen Fehler: Wenn mehrere Benutzer dasselbe Passwort haben, ist das Hash-Passwort in der Datenbank dasselbe. Wenn Sie also Zugriff auf die Datenbank haben und das Passwort eines Benutzers kennen, ist es sehr einfach, alle Benutzer zu finden, die dieses Passwort teilen. Um etwas sicherer zu machen, sollten Sie ein Passwort-Kodierungsschema verwenden, das einige Salze enthält.

    
gabuzo 11.01.2011, 09:30
quelle
2

sieht so aus, als ob Sie [ein Byte-Array übergeben haben, wo eine Zeichenfolge erforderlich war.

probiere { login.getEmail(), new String(digest) }; anstelle von { login.getEmail(), digest };

aus

refer http://download.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#String%28byte []% 29

    
Nishant 11.01.2011 09:18
quelle
0

Der Fehler scheint in Zeile 30 zu liegen, was vermutlich die Object[] Parameterzeile ist. In diesem Fall müssen Sie den byte[] Digest in String konvertieren und die Zeichenfolge als Parameter verwenden.

Diese Antwort wurde gegeben, bevor die Frage bearbeitet wurde.

schließe Dinge in Funktionen ein:

%Vor%

natürlich sind die relevanten try / catch immer noch da.

Versuchen Sie, sich von der Angewohnheit e.printStackTrace() zu entfernen, um mit java.utils.logging.Logger oder log4j in die Protokolldateien zu schreiben.

versuchen Sie, nur eine Rückkehr in der Funktion zu haben. Wenn Sie den Code beibehalten, definieren Sie Login login1=null am Anfang der Funktion und weisen Sie ihn einfach im Else-Block zu. Die Rückgabe am Ende sollte return login1 sein (was null oder ein Wert wäre).

Die Teile, in denen Code noch implementiert werden soll (z. B. Fehlercode), sollten mit //TODO: kommentiert werden. Die meisten ids wie eclipse / netbeans finden diese Kommentare automatisch als Aufgaben.

    
Kinjal Dixit 11.01.2011 08:58
quelle