2011-07-21 5 views
0

Webアプリケーション(jsp + hibernate + tomcatのhsqldb)コードでは、Daoの実装をいくつか使用しています。基本クラスDaoの実装には、ドメイン固有のDaoクラスは、この基本クラスを拡張して特定のfind()、delete()メソッドを提供します。休止状態のDAO実装から意味のある例外をスローする

私は、error500メッセージの代わりにエラーが発生したときに意味のあるメッセージを提供したいと考えました。 基本クラスメソッドはget()、saveOrUpdate()メソッドにhibernate.Sessionクラスを使用するため、HibernateExceptionをスローします。ドメイン固有のサブクラスはこれをキャッチしてカスタム例外でラップし、再スローします。

私は、これはit..Iあなたの意見/提案心から

を歓迎行うには正しい方法であれば、このway..Iは知らない、それを試してみました、

ジム

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(); 
     } 

    } 
} 

ドメイン固有のDAOは

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()); 
      } 
     } 

    } 
+0

私の意見では、メソッドのシグネチャに例外をスローすると、例外を再スローする必要がなくなり、try catchでメソッドの使用を制限することができます。 –

答えて

2

はあなたの顧客がmeaniがしたいことが確実ですいいメッセージですか?私はビジネスエラーの場合に意味のあるエラーが現れると信じています。技術的な(読んだり予期しない)エラーについては、おそらくエラー参照コード付きの一般的なエラーページしか表示されませんが、これ以上はありません。

あなたのコードに関するもう1つの問題は、エラーメッセージにe.getMessageを含めることです。潜在的に、メッセージには技術情報が含まれている可能性があるため、システムに侵入するのに役立つ可能性があります。しかし、ログには、エラーに関する可能な限り多くの情報(適切な制限内で、パスワード、カードの詳細は存在しない)が必要です。

したがって、技術的なエラーのための基本的なルールはできるだけお客様に見せます。ビジネスエラーは別の話ですが、ここでは可能な限り明確にする必要があります。

+0

返信いただきありがとうございます。現在、ほとんどのdb関連のエラーはerror500メッセージを引き起こします。私はそれを少し変更するつもりだと思っていました。upvoteにお願いしましたが、分評があります – jimgardener

関連する問題