`

基于Spring和hibernate的灵活的异常处理办法

    博客分类:
  • Java
阅读更多
在spring,hibernate中异常的处理都交给了spring框架,在hibernate只需要写很少的代码就可以实现异常的控制。
在单元测试代码中:
public final void testFindFunctionById() {
logger.debug("testFindFunctionById");
long l1=System.currentTimeMillis();
String id="4";
Function function=BeanFactory.getInstance().getRightDelegate().findFunctionById(id, state);
    long l2=System.currentTimeMillis();
    System.out.println("function.getId = "+function.getId());
    System.out.println("function.getName = "+function.getName());
    System.out.println("function.getProtectFunction = "+function.getProtectFunction());
    System.out.println("--------------finish----------------");  
    System.out.println("一共用时为 :  "+(l2-l1));   
}

在delegate中接受信息:
public Function findFunctionById(String id, IState state) {
if (DelegateUtil.isNullParam(id, "id", state)) {
return null;
}
Request req = new Request();
req.setServiceName(ServiceConsts.FindFunctionByIdProcessor);
req.setValue("id", id);
try {
Response resp = getDelegate().execute(req);
DelegateUtil.setIState(state, resp);
Function function = (Function) resp.getValue("function");
DelegateUtil.setIState(state, resp);
return function;
} catch (Exception e) {
DelegateUtil.handleException(e, "findFunctionById", state);
return null;
}
}
在delegate中首先对参数做一般的空指针检查,如下面的代码
public static boolean isNullParam(Object paramObject, String paramName,
IState state)
{
if (paramObject == null) {
logger.error("Parameter " + paramName + " is null;");
state.setErrCode(ErrorCode.PARAMETER_ERROR);
return true;
}
return false;
}
如果传值是null的话,在state中设置ErrorCode.PARAMETER_ERROR参数直接返回给客户端,客户端根据不同的ErrorCode可以知道问题的所在,并作出相应的操作。
   然后生成一个Request,封装了这次请求的参数,如ServiceName和values。请求分发到相应的service,如FindFunctionByIdProcessor。Service再将请求分发到service下面的command,command代码如下:
public class FindFunctionById extends Command
{
private FunctionDao dao;
public void setDao(FunctionDao dao) {
this.dao = dao;
}
public void execute(Map params, Map response) throws Exception
{
response.put("function",(Function)dao.getById(Function.class, (String) params.get("id")));
}
……
}
在command中把参数接下来调用dao的方法,并把结果放在response中。在delegate就可以在response中取得结果。
Dao的代码如下:
public Object getById(Class c, Serializable id) {
return getHibernateTemplate().get(c, id);
}
在dao中只是调用了spring的类。这个调用流程没有涉及到异常的捕捉。那他是在哪里处理的呢?看下面的代码(习惯了以代码说话了,呵呵)
public class SequenceProcessor extends BaseProcessor {
private static Logger logger=Logger.getLogger(SequenceProcessor.class);
    public boolean supports(Component component) {
        return (component instanceof Command);
    }
    public void doActivities(Request request,Response resp) throws Exception {
        logger.info("SequenceProcessor 流程开始 <-- "+getBeanName() );
Map response = resp.getValues();
Map params = request.getValues();
        List activities = getActivities();
        for (Iterator it = activities.iterator(); it.hasNext();) {
            Component component = (Component) it.next();
            logger.info("活动 : " + component.getBeanName());
            try {
            component.init("");
            component.execute(params, response);
            component.fini();
            } catch (Throwable th) {
                ErrorHandler errorHandler = component.getErrorHandler();
                if (errorHandler == null) {
                    logger.info("no Errorhandler for Command "+component.getBeanName() +", run processor Errorhandler and abort Command ");
                    ErrorHandler processorerrorHandler=getErrorHandler();
                    if(processorerrorHandler == null){
                    logger.info("no error handler for this processor, run defaultErrorHandler and abort processor ");
                    //执行全局的default ErrorHandler;
                    ErrorHandler defaultErrorHandler=((ErrorHandler)ContextServiceLocator.getInstance().getBean("defaultErrorHandler"));
                    if(defaultErrorHandler!=null)
                      defaultErrorHandler.handleError(resp, th);
                    else{
                    logger.info("no default errorHandler for this invoke process, abort!!");
                    }
                    }else{
                        // 执行processor级的ErrorHandler;
                    logger.info("run processor errorHandler and continue");
                    processorerrorHandler.handleError(resp, th);
                    }
                 
                } else {
                    logger.info("run Command Errorhandler and continue");
//                  执行Component级的ErrorHandler;
                    errorHandler.handleError(resp, th);
                }
            }
 
        }
        logger.info(" SequenceProcessor 流程结束 -->");
    }
}
在service中发生了异常有3个地方可以做切入点来做处理。Command级别,service级别和全局的错误处理器。如果在command中发生异常,首先查找Command级别的错误处理器,找不到则找service级别的错误处理器,再找不到就找全局的错误处理器,什么也没有找到异常则继续抛下去一直到客户端。如下面配置文件所示:
<bean id="activity2"
class="org.artemis.workflow.command.Activity2">
<property name="errorHandler">
<ref bean="defaultErrorHandler" />
</property>
</bean>
<!-- error handler -->
<bean id="defaultErrorHandler"
class="com.gsta.eshore.framework.jcf.JCFErrorHandler" />
在activity2中发生异常就会查找defaultErrorHandler来做相应的处理。
public class JCFErrorHandler implements ErrorHandler {

    private String beanName;
    private static Logger logger=Logger.getLogger(JCFErrorHandler.class);

    public void handleError(Response resp, Throwable th) throws Exception{
    if (th instanceof ClientException) {
            logger.error("JCFErrorHandler is dealing with ClientException errorCode is "+((ClientException)th).getErrorCode(),th);
resp.setReturnCode(Response.APPLICATION_LEVEL_ERROR);
resp.getState().setErrCode(ErrorCode.BUSINESS_ERROR);
        throw (ClientException)th;
    }
    else if (th instanceof GoOnException) {
        logger.error("JCFErrorHandler is dealing with GoOnException", th);
        } else if(th instanceof JCFException){
            logger.error("JCFErrorHandler is dealing with JCFException errorCode is "+((JCFException)th).getErrorCode(),th);
resp.setReturnCode(Response.APPLICATION_LEVEL_ERROR);
resp.getState().setErrCode(ErrorCode.JCF_ERROR);
        throw (JCFException)th;
        } else if(th instanceof RemoteException){
            logger.error("JCFErrorHandler is dealing with RemoteException",th);
resp.setReturnCode(Response.SYSTEM_LEVEL_ERROR);
resp.getState().setErrCode(ErrorCode.SYSTEM_ERROR);
        throw (RemoteException)th;
        } else if(th instanceof EJBException){
            logger.error("JCFErrorHandler is dealing with EJBException",th);
resp.setReturnCode(Response.SYSTEM_LEVEL_ERROR);
resp.getState().setErrCode(ErrorCode.CALL_EJB_ERROR);
        throw (EJBException)th;
       } else if(th instanceof NullPointerException){
        logger.error("JCFErrorHandler is dealing with RemoteException",th);
resp.setReturnCode(Response.APPLICATION_LEVEL_ERROR);
resp.getState().setErrCode(ErrorCode.NULLPOINT_ERROR);
    throw (NullPointerException)th;
    }
        else{
            logger.error("JCFErrorHandler is dealing with Exception",th);
resp.setReturnCode(Response.APPLICATION_LEVEL_ERROR);
resp.getState().setErrCode(ErrorCode.SYSTEM_ERROR);
if(th instanceof Exception)
               throw (Exception)th;
        }
    }
    public void setBeanName(String beanName) {
        this.beanName = beanName;
    }
}
可以为每一个command或者service定制不同的错误处理器。针对不同的异常来设置不同的errorCode,同时后端的异常不会影响到客户端的操作。
   总结:把异常处理抽取出来,代码进一步简化。如果有什么疑问或者good idea欢迎给我发邮件:gmhwq@126.com
分享到:
评论

相关推荐

    Java Web 基于Spring Struts Hibernate 轻量级架构开发实例

    4. 创建MVC应用程序,使用Struts2接收和处理请求,Spring管理业务逻辑,Hibernate处理数据存储。 5. 深入探讨Spring的事务管理,以及如何在Struts2中集成Spring的事务控制。 6. 错误和异常处理,以及如何在Struts2和...

    基于Spring的Hibernate Search全文检索功能示例

    【标题】"基于Spring的Hibernate Search全文检索功能示例"主要展示了如何在Spring框架中集成Hibernate Search库,实现高效、灵活的全文检索功能。Hibernate Search是Hibernate ORM的一个扩展,它允许我们在Java应用...

    Struts2,Spring,Hibernate jar包下载

    **Struts2** 是一个基于MVC设计模式的Web开发框架,它在Struts1的基础上进行了很多改进,提供了更灵活的控制结构和更好的异常处理机制。Struts2的核心组件包括Action、Result、Interceptor等,它们协同工作,实现了...

    osworkflow2.8基于Spring+Hibernate

    在本文中,我们将深入探讨如何将osWorkflow2.8版本与Spring和Hibernate框架进行集成,以实现高效、灵活的企业级应用。 一、osWorkflow基础介绍 osWorkflow提供了一个强大的工作流定义和执行平台,允许开发者通过XML...

    spring2.5 hibernate api

    Spring的DAO(Data Access Object)支持为基于Hibernate的持久层提供了通用的异常翻译,将Hibernate的异常转换为Spring的DataAccessException层次结构,使得应用程序可以统一处理数据访问异常。此外,Spring的...

    基于Spring与Hibernate的数据库访问技术研究

    ### 基于Spring与Hibernate的数据库访问技术研究 #### 引言 在现代企业级应用开发中,数据持久层的设计至关重要,它涉及到如何高效、安全地存储和检索数据。随着互联网技术的发展,传统的两层架构(客户端/服务器...

    Spring整合HIbernate

    4. **基于注解的配置**:Spring 3.0及以上版本支持基于注解的配置,可以与Hibernate的实体注解结合,减少XML配置文件。 二、整合步骤 1. **添加依赖**:在项目中引入Spring和Hibernate的相关库,确保Maven或Gradle...

    基于spring mvc+spring+hibernate+bootstrap+maen开发的企业级项目,直接导出即可运行

    它提供了一个灵活的MVC(Model-View-Controller)架构,支持请求处理、数据绑定、验证和异常处理等功能。开发者可以利用Spring MVC轻松地创建功能丰富的、高性能的Web应用。 2. **Spring**:Spring框架是Java领域最...

    Struts+Spring+Hibernate整合练习

    Struts+Spring+Hibernate 整合是Java Web开发中常用的一种技术栈,它结合了三个强大的框架,分别负责表现层(Struts)、业务逻辑层(Spring)和持久化层(Hibernate)。这种组合提供了完整的MVC架构,使得开发过程...

    spring+hibernate整合实现简单数据库添加记录

    总之,Spring+Hibernate的整合为Java开发者提供了一种高效且灵活的方式来处理数据库操作。通过理解这两个框架的核心原理以及整合过程,初学者能够更好地掌握企业级应用开发的技巧。实践这些步骤,不仅可以帮助你实现...

    基于注解整合spring与hibernate

    本文将深入探讨如何基于注解的方式整合Spring与Hibernate,帮助新手更好地理解和实践这两个框架的整合。 首先,让我们了解Spring中的注解。Spring注解如`@Autowired`、`@Service`、`@Repository`和`@Controller`...

    spring和hibernate集成后,通用的basedao

    在基于Spring和Hibernate的应用中,实现分页通常涉及到使用Hibernate的Criteria API或HQL来添加LIMIT和OFFSET子句,或者使用Spring Data JPA的Pageable接口。 总结起来,这个"ssh"压缩包中的示例代码展示了如何在...

    SSH(Spring+Hibernate+Struts2)框架整合必须的85个jar包

    SSH框架整合是Java Web开发中常见的一种技术栈,由Spring、Hibernate和Struts2三个开源框架组合而成。这个组合提供了一种高效、灵活且可扩展的解决方案,用于构建企业级的Web应用程序。以下是对SSH框架整合及其中...

    spring+hibernate登录系统

    Spring以其灵活的依赖注入和强大的AOP(面向切面编程)功能而著名,而Hibernate则是Java领域中最常用的ORM(对象关系映射)工具,能够简化数据库操作。这个"spring+hibernate登录系统"是将这两个框架进行整合的实例...

    ssh(struts+spring+hibernate)教务管理信息系统(全部代码) 可以直接运行

    这个教务管理信息系统是基于SSH框架实现的,提供了完整的源代码,可以直接运行,便于开发者学习和参考。 **Struts框架**: Struts是MVC(Model-View-Controller)设计模式的一个实现,主要负责控制层。它通过Action...

    struts2+spring2.5+hibernate3.2

    Struts2、Spring2.5和Hibernate3.2是经典的Java Web开发框架组合,被称为SSH(Struts2、Spring、Hibernate)集成。这个整合包可能是为了帮助开发者快速搭建基于这些技术的项目环境。 Struts2是MVC(Model-View-...

    spring+hibernate框架搭建demo

    Spring是一个全面的后端开发框架,而Hibernate则是一个强大的对象关系映射(ORM)工具,两者结合可以构建出高效、灵活的企业级应用程序。下面我们将深入探讨Spring和Hibernate框架的搭建过程以及相关知识点。 首先...

    struts2+spring+hibernate+jquery+json

    Struts2 提供了强大的拦截器机制,可进行灵活的扩展和自定义行为,例如表单验证、异常处理等。 接下来,Spring 框架是Java企业级应用开发的核心。它提供了依赖注入(DI)和面向切面编程(AOP)等功能,帮助简化应用...

    基于springsecurity+springmvc+spring+hibernate的权限管理系统源码.rar

    它能够灵活地定义权限规则,比如基于角色的访问控制(RBAC),并能处理各种安全相关的异常。 **Spring MVC** Spring MVC是Spring框架的一个模块,用于构建Web应用程序。它提供了模型-视图-控制器(MVC)的设计模式...

Global site tag (gtag.js) - Google Analytics