V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
thinkmore
V2EX  ›  Java

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

  •  1
     
  •   thinkmore ·
    generalthink · 2014-10-06 18:59:05 +08:00 · 3588 次点击
    这是一个创建于 3712 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    也就是在底层不考虑异常,只管往外层抛,在最外层统一处理下就ok
    arslion
        8
    arslion  
       2014-10-06 20:19:50 +08:00
    关注
    我一般都直接log的, 没往外抛过..
    wecoders
        9
    wecoders  
       2014-10-07 09:57:22 +08:00
    @thinkmore try/catch不需要在dao层写,直接放controller里面,或者直接统一扑捉异常(拦截),然后打印日志,并显示错误页面。
    thinkmore
        10
    thinkmore  
    OP
       2014-10-07 18:16:48 +08:00
    @wanjun 你的意思是我只管往外抛了?然后统一配置异常页面,但是我是需要进行日志记录的呀
    thinkmore
        11
    thinkmore  
    OP
       2014-10-07 18:21:27 +08:00
    @wecoders 如你这种说法,只管往外抛的话那么如果我想要自定义异常明显行不通,其次不是所有的Dao方法都可以不写try/catch的呀!
    epkT6QJ3RSaz6AnJ
        13
    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
        14
    epkT6QJ3RSaz6AnJ  
       2014-10-08 02:16:13 +08:00   ❤️ 1
    我的理解就是@Repository和@Resource一块使用,spring 帮你实现了如下连接中的功能
    http://www.springbyexample.org/examples/simple-hibernate-xml-config-code-example.html
    thinkmore
        15
    thinkmore  
    OP
       2014-10-08 23:25:15 +08:00
    @epkT6QJ3RSaz6AnJ 很感谢你的回答,让我有了一点感觉了,诚然在hibernate4中不在使用template了,只需要注入sessionFactory,然后得到Session就行了,现在我想要的是做这些处理的时候,在Dao层,人为捕获异常,然后将异常信息记录成为日志,并且向上一层抛出自定义异常(RuntimeException),这里我想要把某些公共的代码提取出来编程类似于HibernateTemplate的那种回调式方法或者叫做方法式编程,但是功力不够呀!望指导
    epkT6QJ3RSaz6AnJ
        16
    epkT6QJ3RSaz6AnJ  
       2014-10-09 00:18:07 +08:00   ❤️ 1
    @thinkmore 貌似AOP编程可以解决吧,用@AfterThrowing之类的吧
    可以参考这个大牛的文章,IOC和AOP是Spring两大核心内容要好好学下,这样基本可以搞定了吧
    http://www.mkyong.com/spring3/spring-aop-aspectj-annotation-example/
    thinkmore
        17
    thinkmore  
    OP
       2014-10-09 08:56:03 +08:00
    @epkT6QJ3RSaz6AnJ,非常感谢,满意结贴!顺便吐槽一句为啥不能上传图片呢?
    epkT6QJ3RSaz6AnJ
        18
    epkT6QJ3RSaz6AnJ  
       2014-10-09 17:01:02 +08:00
    @thinkmore 连代码都不高亮
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3598 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 04:30 · PVG 12:30 · LAX 20:30 · JFK 23:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.