在我的web应用程序(jsp + hibernate + hsqldb on tomcat)代码中,我使用了几个Dao实现。基类Dao实现包含所有会话打开,关闭逻辑。一些特定于域的Dao类扩展了这个基础class提供特定的find(),delete()方法
我想在发生错误时向用户提供有意义的消息,而不是error500消息。 因为,基类方法对get(),saveOrUpdate()方法使用了hibernate.Session类,所以它们会抛出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();
}
}
}
特定于域的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 :(得分:2)
您确定客户想要有意义的消息吗?我认为,只有在出现业务错误时才会出现有意义的错误。对于技术(读取,意外)错误,客户应该只看到通用错误页面,可能包含错误参考代码,但不会更多。
您的代码的另一个问题是您将e.getMessage包含在错误消息中。这样做并不好,因为潜在地,该消息可能包含一些技术信息,这可能有助于侵入您的系统。但是,据说,日志必须尽可能多地提供有关错误的信息(在合理范围内,不应该有密码,卡片详细信息)。
因此,基本规则 - 技术错误会尽可能地向客户展示。商业错误是另一个故事,在这里你应该尽可能清楚。