Hallo,
ich habe mir das Code-Beispiel unter
https://github.com/hbci4j/hbci4java/blob/master/src/main/java/org/kapott/hbci/examples/UmsatzAbrufPinTan.javamal etwas genauer angesehen und habe den Code mit leichten Modifikationen für mich übernommen. Anfangs hat alles wunderbar geklappt und lief auch wirklich problemlos, nur bin ich jetzt leider auf ein Problem gestoßen: In meinem Programm möchte ich mehrere HBCI-Zugänge konfigurieren. Der erste kann wunderbar analog zum Codebeispiel angelegt werden, bei der Konfiguration des zweiten Zugangs kommt es dann zu einem Fehler:
...
Caused by: org.kapott.hbci.exceptions.HBCI_Exception: *** loading of passport file failed
at org.kapott.hbci.passport.HBCIPassportPinTan.read(HBCIPassportPinTan.java:237)
at org.kapott.hbci.passport.HBCIPassportPinTan.<init>(HBCIPassportPinTan.java:104)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.kapott.hbci.passport.AbstractHBCIPassport.getInstance(AbstractHBCIPassport.java:719)
at org.kapott.hbci.passport.AbstractHBCIPassport.getInstance(AbstractHBCIPassport.java:757)
at org.kapott.hbci.passport.AbstractHBCIPassport.getInstance(AbstractHBCIPassport.java:769)
at de.mho.finpim.service.FinPimBankingImpl.initBanking(FinPimBankingImpl.java:124)
at de.mho.finpim.service.FinPimBankingImpl.fetchAccounts(FinPimBankingImpl.java:36)
at de.mho.finpim.ui.parts.banking.BankAccountSelectionPart.createControls(BankAccountSelectionPart.java:68)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55)
... 68 more
Caused by: org.kapott.hbci.exceptions.HBCI_Exception: Fehler beim Erzeugen des Schlüssels aus dem Passwort
at org.kapott.hbci.passport.AbstractHBCIPassport.calculatePassportKey(AbstractHBCIPassport.java:807)
at org.kapott.hbci.passport.HBCIPassportPinTan.read(HBCIPassportPinTan.java:181)
... 84 more
Caused by: org.kapott.hbci.exceptions.InvalidUserDataException: Passwort darf nicht leer sein
at org.kapott.hbci.passport.AbstractHBCIPassport.calculatePassportKey(AbstractHBCIPassport.java:794)
... 85 more
Erstmal zur Aufklärung hier die Methode, in der die Exception fliegt:
private HBCIPassport initBanking(Bank b)
{
Properties props = new Properties();
HBCIUtils.init(props, new HBCICallbackFinPim(b));
final File passportFile = new File("PP.dat");
HBCIUtils.setParam("client.passport.default","PinTan"); // Legt als Verfahren PIN/TAN fest.
HBCIUtils.setParam("client.passport.PinTan.filename",passportFile.getAbsolutePath());
HBCIUtils.setParam("client.passport.PinTan.init","1");
HBCIPassport passport = AbstractHBCIPassport.getInstance();
passport.setCountry("DE");
BankInfo info = HBCIUtils.getBankInfo(b.getBlz());
passport.setHost(info.getPinTanAddress());
passport.setPort(443);
passport.setFilterType("Base64");
return passport;
}
Zur weiteren Information: Nach diesem Aufruf der initBanking Methode werden in einer weiteren Methode die Kontoinformationen abgerufen. Das wird logischerweise durch einen HBCIJob erledigt.Diese Methode wird vor der Rückgabe des Ergebnisses so terminiert:
...
handle.close();
HBCIUtils.doneThread();
...
Interessanterweise tritt exakt derselbe Fehler auch dann auf, wenn ich die Bankverbindung, die ich hier im zweiten Schritt anlegen will, gleich als erstes anlegen will?! Weshalb aber wird nun überhaupt versucht, dass Passportfile zu laden und einen entsprechenden Schlüssel dafür zu erzeugen? Das hier steht ja im Kommentar des Beispielcodes:
| // In der Passport-Datei speichert HBCI4Java die Daten des Bankzugangs (Bankparameterdaten, Benutzer-Parameter, etc.). |
| // Die Datei kann problemlos geloescht werden. Sie wird beim naechsten mal automatisch neu erzeugt, |
| // wenn der Parameter "client.passport.PinTan.init" den Wert "1" hat (siehe unten). |
// Wir speichern die Datei der Einfachheit halber im aktuellen Verzeichnis
Daher bin ich bisher davon ausgegangen, dass diese Datei außer Acht gelassen werden kann.Ist dem vielleicht doch nicht so?
Danke für eine Aufklärung,
Michael