Dear All: 各位 V2exr 们,Java 程序猿来寻求帮助来了。

2014-10-06 18:59:05 +08:00
 thinkmore

大家好呀,首先声明我是一个程序猿!一个以写出好程序自豪的程序猿,我现在编写的程序是依靠于 Java 语言,更进一步的说是 JavaWeb 方向,最近在研究 SpringMVC,Spring+Hibernate4,在这个过程中遇到了小小的疑问。有点强烈的强迫症(或许程序猿大都存在吧),总是觉得不解决,如鲠在喉。在 Spring 集成 Hibernate3 的时候,Spring 为编程者们提供了一个 HibernateTemplate 类,其中的方法式编程让我大受启发。但是在 Hibernate4 中已经不提供这个类了(因为 Hibernate 已经做得足够好了),如果当我现在有这么一个需求的时候,那么我的代码将变得非常恶心。具体需求如下:

Dao层:
当捕获到HibernateException(RuntimeException的子类)的时候,需要在后台以日志的方式记录,同时需要将异常告知上一层,最后统一在Controller层中做统一处理(给前台页面一个友好的提示)。

问题:如果在dao层中将所有的代码都try{}catch{}的话,那么看上去是非常恶心的(我觉得恶心),现在我想要通过回调的方式对所有方法进行处理。但是已经没有这个HibernateTemplate类了,所以是需要我自己写一个吗?还是大家有更好的办法呢?希望大家可以将大家平时的写法告知一下(由于保密原则,部分代码也行,如果大家觉得代码有所泄露,可以处理一下),不胜感激!请大家帮助一下。
一个挑剔的程序猿

3466 次点击
所在节点    Java
18 条回复
thinkmore
2014-10-06 19:10:31 +08:00
大家如果有GitHub上什么好的项目,也可以推荐一下,最好是Spring+Hibernate的项目,XML配置更好,Thanks
belin520
2014-10-06 19:15:09 +08:00
谁声大听谁的!!
belin520
2014-10-06 19:16:33 +08:00
我擦,回错贴了,不好意思,容我回来把楼上的字粘贴走
casparchen
2014-10-06 19:21:48 +08:00
楼主太啰嗦了,看了一点实在看不到关键内容,放弃了
thinkmore
2014-10-06 20:03:43 +08:00
@casparchen 好吧,简而言之,我想要知道大家Dao层是如何写的,不太想要看到session.query(sql)这种答案。要显示捕获异常(即使是RuntimeException)
Kai
2014-10-06 20:06:13 +08:00
移动到 /go/java
wanjun
2014-10-06 20:10:58 +08:00
没有你这么用过,
用纯servlet的时候,会有个总的servlet入口,在这里处理异常,内部不做处理
用spring+cxf 的时候,配置一个 cxf异常拦截,内部也不做任何处理

也就是在底层不考虑异常,只管往外层抛,在最外层统一处理下就ok
arslion
2014-10-06 20:19:50 +08:00
关注
我一般都直接log的, 没往外抛过..
wecoders
2014-10-07 09:57:22 +08:00
@thinkmore try/catch不需要在dao层写,直接放controller里面,或者直接统一扑捉异常(拦截),然后打印日志,并显示错误页面。
thinkmore
2014-10-07 18:16:48 +08:00
@wanjun 你的意思是我只管往外抛了?然后统一配置异常页面,但是我是需要进行日志记录的呀
thinkmore
2014-10-07 18:21:27 +08:00
@wecoders 如你这种说法,只管往外抛的话那么如果我想要自定义异常明显行不通,其次不是所有的Dao方法都可以不写try/catch的呀!
epkT6QJ3RSaz6AnJ
2014-10-08 02:10:54 +08:00
epkT6QJ3RSaz6AnJ
2014-10-08 02:14:00 +08:00
// This is it

@Repository
public class YourFooDao {

@Resource
private SessionFactory sessionFactory;

private Foo get(long id){
return (Foo) sessionFactory.getCurrentSession().get(id);
}
}
epkT6QJ3RSaz6AnJ
2014-10-08 02:16:13 +08:00
我的理解就是@Repository和@Resource一块使用,spring 帮你实现了如下连接中的功能
http://www.springbyexample.org/examples/simple-hibernate-xml-config-code-example.html
thinkmore
2014-10-08 23:25:15 +08:00
@epkT6QJ3RSaz6AnJ 很感谢你的回答,让我有了一点感觉了,诚然在hibernate4中不在使用template了,只需要注入sessionFactory,然后得到Session就行了,现在我想要的是做这些处理的时候,在Dao层,人为捕获异常,然后将异常信息记录成为日志,并且向上一层抛出自定义异常(RuntimeException),这里我想要把某些公共的代码提取出来编程类似于HibernateTemplate的那种回调式方法或者叫做方法式编程,但是功力不够呀!望指导
epkT6QJ3RSaz6AnJ
2014-10-09 00:18:07 +08:00
@thinkmore 貌似AOP编程可以解决吧,用@AfterThrowing之类的吧
可以参考这个大牛的文章,IOC和AOP是Spring两大核心内容要好好学下,这样基本可以搞定了吧
http://www.mkyong.com/spring3/spring-aop-aspectj-annotation-example/
thinkmore
2014-10-09 08:56:03 +08:00
@epkT6QJ3RSaz6AnJ,非常感谢,满意结贴!顺便吐槽一句为啥不能上传图片呢?
epkT6QJ3RSaz6AnJ
2014-10-09 17:01:02 +08:00
@thinkmore 连代码都不高亮

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/137294

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX