tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
6
ZUGRIFFE
677
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    navino navino ist offline Mitglied Silber
    Registriert seit
    Jun 2007
    Beiträge
    50
    Hallo,

    ich stelle gerade eine Webanwendung von Hibernate auf JPA um, und stelle mir gerade die Frage was ich mit Exceptions vom Typ NoResultException oder generell mit Exceptions mache.

    Habe also den klassischen Aufbau von Service und einer DAO Klasse.

    @Override
    public User getUser(String username, String password) {
    try{
    Query q = em.createQuery ("from User u where u.username = :username and u.password= assword");
    q.setParameter("username",username);
    q.setParameter("password",password);
    return (User)q.getSingleResult();
    }catch(NoResultException nre){
    return null;
    }
    }

    Wie mache ich das am Besten?

    Gruß
    navino
     

  2. #2
    slowfly slowfly ist offline Mitglied Bronze
    Registriert seit
    Mar 2009
    Beiträge
    40
    Jo, wenn du return null machst, musst du in der JavaDoc einfach schreiben "returns null, if no user with the given password was found" ;P

    Was du mit anderen Exceptions machst, das ist ja fast schon eine "strategische Frage". Wir bei uns unterscheiden zwischen "business errors" und "system errors". Also business error ist "Passwort inkorrekt". System error ist "Datenbankweg". Business errors geben Meldungen an den Benutzer, System errors geben Meldungen an den Benutzer ("Sorry, da hat's uns was um die Ohren genauen"), plus eine entsprechende Meldung inkl. Stacktrace an den Produktverantwortlichen.

    Zusatz 1: Für Webapplikationen kommt dann normalerweise und hoffentlich einfach die Meldung "Benutzername oder Passwort nicht korrekt" - vor Allem wenn der Benutzername eine E-Mailadresse ist, ist es von Vorteil, einem "Angreifer" nicht mitzuteilen, ob die E-Mail jetzt existiert oder nicht.

    Zusatz 2: Wir bei uns machen für "logging purpose" immer gerne zuerst einen select mit der where-clause auf den Benutzernamen und dann einen select mit der where-clause auf den Benutzernamen und das Passwort.

    Zusatz 3: Bitte das Passwort in der Datenbank verschlüsselt als Hash ablegen =(

    Gruss
    slowy
     

  3. #3
    navino navino ist offline Mitglied Silber
    Registriert seit
    Jun 2007
    Beiträge
    50
    Hallo,

    das mit Unterscheidung nach business und system-errors ist soweit klar. Ich werde die jetzt mit AOP versuchen abzufangen. Bei einer NoResultException werde einfach gar nicht machen und an den Aufrufer null zurückwerfen. Die NoResultException darf aus der DAO-Schicht auch gar nicht raus... denke ich.

    Das mit dem Passwort verschlüsseln und so ist klar


    Gruß
    navino
     

  4. #4
    slowfly slowfly ist offline Mitglied Bronze
    Registriert seit
    Mar 2009
    Beiträge
    40
    Moinmoin

    Also ich habe ja selten was AOP-mässiges gemacht, aber wäre das in diesem Fall nicht die falsche Wahl? Wir benutzen solche sachen und Transaktionen zu starten/committen/rollbacken, ObjectPools zu verwalten oder um Zeiten zu loggen. Dein Fall hat schon eher etwas mit business logic zu tun.

    Ich sehe kein Problem, wenn der DAO in diesem Fall einfach null zurückgibt und der Layer obendran einfach
    if(user == null){msg = "sorry, du gommsch hier ned rein!"}else{machstdulogin()}
    macht,...

    gruss
    slowy
     

  5. #5
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo,

    die Trennung zwischen fachlicher- und technischer Ausnahme finde ich auch eine gute Lösung. Wobei es manchmal nicht so einfach zu entscheiden ist, ob eine Exception nun nur technisch oder doch fachlich ist. Um dort flexible zu bleiben bieten sich generische Mechanismen zur "Übersetzung" einer Ausnhame in einen anderen Ausnahme-Typ an. Im Springframework gibt es dafür beispielsweise die ExceptionTranslator Abstraktion.

    Btw. eine Alternative zum Werfen einer Ausnahme oder der einfachen Rückgabe von "null" wäre die Einführung eines expliziten Null-Objects. Konkret definiert man so etwas wie einen NullUser / NotExistingUser / EmptyUser (extends User, als Singleton) und gibt in dem Fall eines nicht vorhandenen Users die Instanz des NullUsers zurück. Verwendet man dieses Pattern hat man im Code keine expliziten Null-Checks mehr, dies erlaubt etwas schlankeren Code.

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  6. #6
    navino navino ist offline Mitglied Silber
    Registriert seit
    Jun 2007
    Beiträge
    50
    Hallo,

    das mit dem ExceptionTranslator schaue ich mir mal an. Ich bin eigentlich grundsätzlich der Meinung, das die DAO-Exceptions alla NoResultException eigentlich nicht aus dem DAO oder spätestens nicht nach dem Service weitergereicht werden dürfen. Hier müsste eine Überstzung in einen anderen Typ und eigentlich auch noch sprachunabhängig geworfen werden.....

    Das mit "EmptyUser" Object schaue ich mit auch mal an...... Aber dann müsste ich ja bei Null anstatt auf Null auf das EmptyObjekt abfragen....Was habe ich da gwonnen? Gibt es da irgendwo ein kleines Beispiel?

    Gruß
    navino
    W
     

  7. #7
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo,

    Das mit "EmptyUser" Object schaue ich mit auch mal an...... Aber dann müsste ich ja bei Null anstatt auf Null auf das EmptyObjekt abfragen....Was habe ich da gwonnen? Gibt es da irgendwo ein kleines Beispiel?
    Ob man null durch Anwendungscode durchschleifen sollte oder nicht ist so ein bisschen eine philosophische Frage. Die Motivation dazu kann man an vielen Stellen nachlesen. Beispiele wären http://code.google.com/p/guava-libra...gNullExplained
    http://cs.oberlin.edu/~jwalker/nullObjPattern/

    Wenn du bei loadUserByName null zurück gibst kann das mehrere Gründe haben...
    Gab es einen Fehler beim Abfragen der Datenbank der behandelt wurde ?
    Gab es den User nicht?
    Gab es mehrere User?

    Gibst du explizit NotExistingUser zurück ist klar welcher Fall aufgetreten ist.
    Kommt null zurück impliziert dies, das ein Fehler aufgetreten ist. Das geht dann einher mit der philosophie Fail-Fast -> Bei Fehler so früh wie möglich aussteigen um darauf auch so früh wie möglich aufmerksam zu werden.

    Beispiele für Null-Objects in der JRE Standard-Bibliothek wären z.B. Collections.EMPTY_LIST, Collections.EMPTY_SET, Collections.EMPTY_MAP.

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

Ähnliche Themen

  1. SEHException wurde nicht behandelt
    Von exiter28 im Forum .NET Windows Forms
    Antworten: 12
    Letzter Beitrag: 19.01.11, 10:10
  2. Nicht als Double behandelt
    Von Syrill im Forum Java
    Antworten: 3
    Letzter Beitrag: 02.11.10, 20:52
  3. Wordwrap, das Links separat behandelt
    Von diggity im Forum PHP
    Antworten: 3
    Letzter Beitrag: 28.06.05, 22:40
  4. Antworten: 2
    Letzter Beitrag: 14.05.05, 01:04
  5. event wird 2mal behandelt :(
    Von theonlyandy im Forum .NET Archiv
    Antworten: 1
    Letzter Beitrag: 17.12.04, 18:53