Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > NoSuchMethodError extraño

Hola,

Me he encontrado una situación un tanto extraña, y no sé porque sucede.
Tengo un código que compilo en mi equipo con Java6, y el jar generado lo ejecuto en una máquina IBM, con su Java propio.

Bien, hay un metodo que al llamarse me devuelve el siguiente error:
Exception in thread "main" java.lang.NoSuchMethodError: sun/security/pkcs/SignerInfo.getDigestAlgorithmId()Lsun/security/x509/AlgorithmId;
at reflex.Reflex.testPKCS7(Reflex.java:151)
at reflex.Reflex.main(Reflex.java:43)

Que además, aun lanzado dentro de un try{...}catch(Exception e){...}, la exception no es capturada y sale de la ejecución con error.

La clase que estoy usando es sun.security.pkcs.PKCS7, y el método que da el error es getDigestAlgorithmId(), el cual devuelve un objeto de la clase sun.security.x509.AlgorithmId.

Bueno, en la máquina IBM he visto que este método devuelve un objeto de la clase com.ibm.security.x509.AlgorithmId, y que es por el motivo que me está dando el error.

Si creo una variable con este objeto me devuelve un error al principio de la ejecución porque no encuentra el import, y si no hago el import directamente, y llamo al método getName() (lo tienen igual sun que ibm), da el error, pero más avanzada la ejecución.

Pero mi sorpresa ha sido cuando, haciendo pruebas, he llamado al método por reflection, que entonces ha ido todo ok
¿Alguien puede darme alguna pista de porque actua asi?

Llamada normal;
byte[] p7byte = loadToFile("FirmaPKCS7.p7s");
PKCS7 p7 = null;
try {
p7 = new PKCS7(p7byte);
} catch (ParsingException ex) {
System.out.println("error:" + ex.getLocalizedMessage());
ex.printStackTrace();
System.exit(-1);
}
SignerInfo si = p7.getSignerInfos()[0];
try{
Object result = si.getDigestAlgorithmId().getName();
} catch (Exception e){ ...}
Llamada con reflection:
byte[] p7byte = loadToFile("FirmaPKCS7.p7s");
PKCS7 p7 = null;
try {
p7 = new PKCS7(p7byte);
} catch (ParsingException ex) {
System.out.println("error:" + ex.getLocalizedMessage());
ex.printStackTrace();
System.exit(-1);
}
SignerInfo si = p7.getSignerInfos()[0];
try{
Class clase = si.getClass();
Method metodo = clase.getMethod("getDigestAlgorithmId");
Object result = metodo.invoke(si,null);
System.out.println("Result.clase=" + result.getClass().getName());
System.out.println("Result=" + result);
}catch(Exception e){
System.out.println("Error en llamada con reflection");
e.printStackTrace();
}

Un saludo y muchas gracias por adelantado

junio 28, 2012 | Registered Commentermarsim86

Los packages "sun" no deben utilizarse, porque pueden modificarse, o eliminarse, entre versiones de JavaSE. No son parte del API público de Java.

http://docs.oracle.com/javase/7/docs/technotes/guides/security/

junio 28, 2012 | Registered Commenterchoces