выбрасывая значимые исключения из спящего режима реализации DAO - PullRequest
0 голосов
/ 21 июля 2011

В своем коде веб-приложения (jsp + hibernate + hsqldb на tomcat) я использую несколько реализаций Dao. Реализация базового класса Dao содержит всю логику открытия, закрытия сеанса. Ряд доменных классов Dao расширяют эту базукласс для предоставления конкретных методов find (), delete ()

Я хотел дать пользователю значимые сообщения при возникновении ошибки вместо сообщения error500.Так как метод базового класса использует класс hibernate.Session для методов get (), saveOrUpdate (), они выдают HibernateException. Специфичные для домена подклассы должны перехватить это в некотором пользовательском исключении и перебросить его.

Я попробовал это таким образом .. Я не знаю, если это правильный способ сделать это .. Я бы приветствовал ваше мнение / предложения

искренне,

Джим

abstract class BaseDao{
   private Class persistentClass;
   public BaseDao(Class persistentClass) {
        super();
        this.persistentClass = persistentClass;
    }
   public Object findById(Long id) {
        SessionFactory factory = HibernateUtil.getSessionFactory();
        Session session = factory.openSession();
        Object object = null;
        try {
            object = (Object) session.get(persistentClass, id);
            return object;
        }
        finally {
            session.close();
        }
    }

    @Override
    public void saveOrUpdate(Object obj) {
        SessionFactory factory = HibernateUtil.getSessionFactory();
        Session session = factory.openSession();
        Transaction tx = null;
        try {
        tx = session.beginTransaction();
        session.saveOrUpdate(obj);          
        tx.commit();
        }catch(HibernateException e){
            if (tx != null) {
                       tx.rollback();   

             }
             throw e;
        }finally {
            session.close();
        }

    }
}

Дао для конкретного домена:

class SaleOrderDao extends BaseDao{
    public SaleOrderDao() {
        super(SaleOrder.class);
    }
    @Override
   public SaleOrder findSaleOrderById(Long saleOrderId){            
            SaleOrder so =  (SaleOrder)findById(saleOrderId);
            return  so;

    }
    @Override
    public void saveOrUpdateSaleOrder(SaleOrder so){
         try{
                saveOrUpdate( so);
          }catch(HibernateException e){
              String msg = "could not insert/update saleorder"+so.getSONumber();
               throw new SaleOrderDaoException(msg+"/ "+e.getMessgae());
           }
        }

     }

1 Ответ

2 голосов
/ 21 июля 2011

Вы уверены, что клиент хочет получить осмысленное сообщение? Я считаю, что значимая ошибка должна появиться только в случае бизнес-ошибок. Для технических (читай, неожиданных) ошибок клиент должен видеть только общую страницу ошибок, возможно, с кодом ошибки, но не более того.

Другая проблема с вашим кодом заключается в том, что вы собираетесь включить e.getMessage в сообщение об ошибке. Это не хорошо, потому что, потенциально, это сообщение может содержать некоторую техническую информацию, которая может помочь проникнуть в вашу систему. Но, говоря о том, что журналы должны содержать как можно больше информации (в разумных пределах, не должно быть паролей, сведений о карте) об ошибке.

Так что основное правило - за технические ошибки показывайте клиенту как можно меньше. Деловые ошибки - другая история, здесь вы должны быть максимально понятны.

...