2011-01-05 16 views
17

Sto cercando di ottenere il passaggio crittografato MD5 dal DB MySQL tramite codice Java (Hibernate). Ma non riesco a trovare né String né alcun tipo di Java ragionevole.Che tipo di tipo Java è "[B"?

L'unica cosa che sto ottenendo questo messaggio inutile: java.lang.ClassCastException: [B non può essere lanciato a com.mysql.jdbc.Blob (o qualunque tipo Java provo gettato a).

Ecco il mio metodo:

public void testCrypto() { 
     session.beginTransaction(); 
     // creates native SQL query 
     // uses native MySQL's MD5 crypto 
     final Blob pass = (Blob) session.createSQLQuery("SELECT MD5('somePass')") 
      .list().get(0); 
     session.getTransaction().commit(); 
} 

Qui è pieno traccia dello stack:

java.lang.ClassCastException: [B cannot be cast to com.mysql.jdbc.Blob 
    at domain.DatabaseTest.testCrypto(DatabaseTest.java:57) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at junit.framework.TestCase.runTest(TestCase.java:168) 
    at junit.framework.TestCase.runBare(TestCase.java:134) 
    at junit.framework.TestResult$1.protect(TestResult.java:110) 
    at junit.framework.TestResult.runProtected(TestResult.java:128) 
    at junit.framework.TestResult.run(TestResult.java:113) 
    at junit.framework.TestCase.run(TestCase.java:124) 
    at junit.framework.TestSuite.runTest(TestSuite.java:232) 
    at junit.framework.TestSuite.run(TestSuite.java:227) 
    at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:83) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 

risposta

35

che il mio amico è un array di byte. In JNI, [B viene utilizzato per descrivere un array ([) di byte (B). Un array di int è [I ecc

È possibile ottenere un po 'più informazioni sui descrittori di campo qui:
http://java.sun.com/docs/books/jni/html/types.html (section 12.3.3 dovrebbe essere quello che stai cercando).

+0

Grazie, sei stato di grande aiuto! – Xorty

3

[B è il nome del tipo codificato per un array di byte (byte []), che normalmente dovrebbe apparire solo nelle stringhe di firma del tipo, poiché non è un nome di tipo valido.

6

È il nome della classe byte[].class. Prova questo:

System.out.println(byte[].class.getName()); 

uscita (avete indovinato):

[B

E se si desidera accedere al nome leggibile, utilizzare Class.getCanonicalName():

System.out.println(byte[].class.getCanonicalName()); 

Uscita:

byte []

4

Come dichiarano altre risposte, che è una matrice di byte.

Se si desidera ottenere una stringa da un array di byte, utilizzare il costruttore String:

public void testCrypto() 
{ 
     session.beginTransaction(); 
     // creates native SQL query 
     // uses native MySQL's MD5 crypto 
     final String pass = new String(session.createSQLQuery("SELECT MD5('somePass')") 
      .list().get(0)); 
     session.getTransaction().commit(); 
} 
+0

ottimo, ma questo è un comportamento davvero strano! Questa stringa è esattamente uguale a quella che stampa la console mysql. Ma pass.getBytes(). Length dice che è 32 e MD5 dovrebbe essere 128 bit. Dove ho perso la chiave? – Xorty

+1

@Xorty: Esiste una differenza tra la misurazione della forza della crittografia e la lunghezza di una stringa. MD5 convertirà qualsiasi input in una stringa che non ha più e non meno di 32 caratteri esadecimali. –

+0

Grande, mito sballato;) – Xorty

Problemi correlati