sql >> Databáze >  >> RDS >> Oracle

zachytit výjimku DB v aplikaci JSF+EJB

EJB má koncept systémových výjimek a výjimek aplikací.

Výjimky za běhu, jako je EntityExistsException jsou systémové výjimky. Ty mimo jiné způsobí, že jakákoli transakce bude vrácena zpět a způsobí, že bean instance EJB bude zahozen (zničen). Pro váš problém je nejdůležitější, že budou zabaleny do EJBException .

Kolem chytání těchto výjimek není žádná magie. Úprava kódu od Petra výše,
bude fungovat pouze toto:

Podkladová fazole:

@EJB
private DAOBean daoBean;

public void savePerson(Entity e) {
     try {
         daoBean.save(e);
     } catch (EJBException e) {         
         FacesMessage message = new FacesMessage("entity is already exists.");
         FacesContext.getCurrentInstance.addMessage(null, message);
     }         
}

EJB:

private EntityManager em;

public void save(Entity e) {    
    em.persist(e);    
}

Pamatujte, že můžete načíst příčinu výjimky a zjistit, zda šlo o EntityExistsException nebo ne (vynecháno výše pro stručnost).

Vzhledem k tomu, že v tomto případě pravděpodobně nepotřebujete zničit svou instanci EJB, lepším vzorem je definovat vlastní výjimku, která zdědí z RuntimeException a je označen @ApplicationException pomocí rollback atribut nastaven na true.

Např.

@ApplicationException(rollback = true)
public class MyException extends RuntimeException {

    public MyException(Throwable cause) {
        super(cause);
    }
}

Zabalte EntityExistsException ve vašem EJB do této výjimky a hoďte a chyťte ji.

Důrazně vám doporučuji NE jako výsledek použít chybové kódy nebo booleovský úspěch/selhání. Toto je dobře známý anti vzor a váš kód je náchylný k neuvěřitelným chybám.



  1. Příklad připojení JavaFX MySQL prosím

  2. Jak získat aktuální datum v SQLite

  3. Oracle PL/SQL jak vypočítat rozsah ip pro IPv6 cidr

  4. Proč místo LIKE a ~ funguje pouze SIMILAR TO, když provádíte shodu regulárních výrazů s alternativami