[转]将osworkflow与spring和hibernate集成的基本介绍

简介:

1. 将osworkflow与spring和hibernate结合的原因

    1)简化对osworkflow的配置

    2)利用hibernate框架的一些特性,如持久化,缓存等

    3)事务管理,osworkflow本身是不支持事务的,而事务是作为一个产品的基本功能

    4)可以利用spring加入其它的扩展功能,如用户认证和鉴权。这点本文没有介绍。

2、准备

    下载osworkflow-2.8.0版本 ,下载hibernate-3.2版本,下载spring-framework-2.5.5版本

3、搭建eclipse环境

  测试的工程目录如下:

src  源代码目录

   oswf  包路径

       Test.java 测试类,后面会给出源代码

bin  编译目的目录

    oswf 包路径

         Test.class  编译生成的class文件

   //下面的几个配置文件位于bin目录下

    log4j.properties 这是log4j的配置文件,这可以不需要

    //下面三个hbm.xml文件是osworkflow持久化的o/r映射文件,这是从osworkflow的源代码目录com"opensymphony"workflow"spi"hibernate3下拷出来的。

    HibernateCurrentStep.hbm.xml

    HibernateHistoryStep.hbm.xml

    HibernateWorkflowEntry.hbm.xml

    //下面三个文件直接从osworkflow自带的例子中获取的,其中example.xml是流程定义文件。osuser.xml是osuser的配置文件。workflows.xml是osworkflow配置有哪些流程定义的配置文件。

    example.xml

    osuser.xml

    workflows.xml

osworkflow-spring.xml  //这是spring 的配置文件,位于根目录下,后面会给出源代码

//下面两个是eclipse的工程文件

.project

.classpath

4、编写spring 的beans.xml配置文件

  文件名如osworkflow-spring.xml,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

<!-- 下面配置数据源datasource,这里用的是spring 自带的一个测试用的连接池。也可以用开源的连接池Jakarta Commons DBCP。
如果程序是运行在servlet容器中,如tomcat中,可直接使用在tomcat中配置的数据库连接池jdni。
这里给出的是oracle数据库驱动,可以换成任意的数据库,如mysql等。 -->

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" destroy-method="close">
    <property name="driverClassName">
        <value>oracle.jdbc.driver.OracleDriver</value>
    </property>
    <property name="url">
        <value>jdbc:oracle:thin:@127.0.0.1:1521:orcl</value>
    </property>
    <property name="username">
        <value>test</value>
    </property>
    <property name="password">
        <value>test</value>
    </property>
</bean>
    
<!-- 配置hibernate的sessionFactory以及相关的配置,这是使用hibernate的入口-->
 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  <property name="dataSource"><ref local="dataSource"/></property>
  <property name="mappingResources">
   <list>
    <value>HibernateCurrentStep.hbm.xml</value>
    <value>HibernateHistoryStep.hbm.xml</value>
    <value>HibernateWorkflowEntry.hbm.xml</value>    
   </list>
  </property>
  <property name="hibernateProperties">
   <props>
    <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9iDialect</prop>
    <prop key="hibernate.current_session_context_class">thread</prop>
    <prop key="hibernate.hbm2ddl.auto">create-drop</prop>
   </props>
  </property>
 </bean>

<!-- 配置osworkflow中所用的propertyset,这里配置的是默认的内存方式的propertyset。-->
 <bean id="propertySetDelegate" class="com.opensymphony.workflow.util.PropertySetDelegateImpl"> 
 </bean>

<!-- 配置osworkflow的存储工厂WorkflowStore -->
 <bean id="workflowStore" class="com.opensymphony.workflow.spi.hibernate3.SpringHibernateWorkflowStore">
  <property name="sessionFactory"><ref local="sessionFactory"/></property>
  <property name="propertySetDelegate"> <ref bean="propertySetDelegate"/> </property>
 </bean>

    <!-- 配置osworkflow的工厂类 -->
 <bean id="workflowFactory" class="com.opensymphony.workflow.spi.hibernate.SpringWorkflowFactory" init-method="init">
        <property name="resource"><value>workflows.xml</value></property>
        <property name="reload"><value>false</value></property>
 </bean>

 <bean id="osworkflowConfiguration" class="com.opensymphony.workflow.config.SpringConfiguration">
  <property name="store"><ref local="workflowStore"/></property>
  <property name="factory"><ref local="workflowFactory"/></property>  
 </bean>

   <!-- 配置osworkflow的工作流接口。注意下面的构造函数参数值test是用户名 -->
 <bean id="workflowTarget" class="com.opensymphony.workflow.basic.BasicWorkflow">
  <constructor-arg><value>test</value></constructor-arg>
  <property name="configuration"><ref local="osworkflowConfiguration"/></property> 
 </bean>

    <!-- 下面的配置是配置让oswrorkflow使用spring的事务框架 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
   <property name="sessionFactory" ref="sessionFactory"/>
</bean>

<!-- 应用程序在代码中唯一要关注的就只有这一个Bean,其它不用关注 -->
<bean id="workflow" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
 <property name="transactionManager" ref="transactionManager"/>
 <property name="target" ref="workflowTarget"/>

 <property name="transactionAttributes">
  <props>
   <prop key="*">PROPAGATION_REQUIRED</prop>
  </props>
 </property>
</bean>

</beans>

5、编写测试代码,只有一个类,代码如下:

package oswf;

import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;

import com.opensymphony.user.Group;
import com.opensymphony.user.User;
import com.opensymphony.user.UserManager;
import com.opensymphony.workflow.Workflow;

public class Test {


 public static void main(String[] args) {
  
  try{
  UserManager um = UserManager.getInstance();
     User test = um.createUser("test");
     test.setPassword("test");

     Group foos = um.createGroup("foos");
     Group bars = um.createGroup("bars");
     Group bazs = um.createGroup("bazs");

     test.addToGroup(foos);
     test.addToGroup(bars);
     test.addToGroup(bazs);
  }
  catch(Exception e){
   System.out.println("create user error,app exit");
   return;
  }
  System.out.println("create user success");

  Resource res = new FileSystemResource("osworkflow-spring.xml");
  XmlBeanFactory beanFactory =new XmlBeanFactory(res);
  Workflow workflow = (Workflow) beanFactory.getBean("workflow"); 
  
  try { 
   workflow.initialize("example", 100, null); 
  } catch (Exception e) 
  { 
   e.printStackTrace(); 
  }
 }
}
代码是,首先要创建一个用户(这里使用的是osworkflow默认绑定的osuser框架)。然后获取workflow  bean,再调用initialize方法创建一个新的流程。

6、问题

    1)osworkflow使用了propertyset框架,但propertyset框架和osworkflow都是opensymphony下的一个开源项目。osworkflow中提供的propertyset jar包不支持hibernate3,因此本例子中是使用内存化的propertyset,没有持久化propertyset。

2)osworkflow中的BasicWorkflow类的构造函数必须提供一个参数,参数是osuser中的用户。而且没有提供设置用户的set方法,这样就只能在配置文件中把用户名写死。这只能用在测试环境中。在实际中需要修改这个代码,支持动态设置用户。

3)osuser框架不支持通过hibernate持久化,如果要支持,需要自己下载源代码改写。但osuser支持通过jdbc持久化。

本文转自博客园沉睡森林@漂在北京的博客,原文链接:[转]将osworkflow与spring和hibernate集成的基本介绍,如需转载请自行联系原博主。

目录
相关文章
|
2月前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
定时任务在企业应用中至关重要,常用于异步数据处理、自动化运维等场景。在单体应用中,利用Java的`java.util.Timer`或Spring的`@Scheduled`即可轻松实现。然而,进入微服务架构后,任务可能因多节点并发执行而重复。Spring Cloud Alibaba为此发布了Scheduling模块,提供轻量级、高可用的分布式定时任务解决方案,支持防重复执行、分片运行等功能,并可通过`spring-cloud-starter-alibaba-schedulerx`快速集成。用户可选择基于阿里云SchedulerX托管服务或采用本地开源方案(如ShedLock)
|
4天前
|
存储 前端开发 Java
Spring Boot 集成 MinIO 与 KKFile 实现文件预览功能
本文详细介绍如何在Spring Boot项目中集成MinIO对象存储系统与KKFileView文件预览工具,实现文件上传及在线预览功能。首先搭建MinIO服务器,并在Spring Boot中配置MinIO SDK进行文件管理;接着通过KKFileView提供文件预览服务,最终实现文档管理系统的高效文件处理能力。
|
2月前
|
XML JSON Java
使用IDEA+Maven搭建整合一个Struts2+Spring4+Hibernate4项目,混合使用传统Xml与@注解,返回JSP视图或JSON数据,快来给你的SSH老项目翻新一下吧
本文介绍了如何使用IntelliJ IDEA和Maven搭建一个整合了Struts2、Spring4、Hibernate4的J2EE项目,并配置了项目目录结构、web.xml、welcome.jsp以及多个JSP页面,用于刷新和学习传统的SSH框架。
36 0
使用IDEA+Maven搭建整合一个Struts2+Spring4+Hibernate4项目,混合使用传统Xml与@注解,返回JSP视图或JSON数据,快来给你的SSH老项目翻新一下吧
|
2月前
|
测试技术 Java Spring
Spring 框架中的测试之道:揭秘单元测试与集成测试的双重保障,你的应用真的安全了吗?
【8月更文挑战第31天】本文以问答形式深入探讨了Spring框架中的测试策略,包括单元测试与集成测试的有效编写方法,及其对提升代码质量和可靠性的重要性。通过具体示例,展示了如何使用`@MockBean`、`@SpringBootTest`等注解来进行服务和控制器的测试,同时介绍了Spring Boot提供的测试工具,如`@DataJpaTest`,以简化数据库测试流程。合理运用这些测试策略和工具,将助力开发者构建更为稳健的软件系统。
39 0
|
2月前
|
数据库 开发者 Java
颠覆传统开发:Hibernate与Spring Boot的集成,让你的开发效率飞跃式提升!
【8月更文挑战第31天】在 Java 开发中,Spring Boot 和 Hibernate 已成为许多开发者的首选技术栈。Spring Boot 简化了配置和部署过程,而 Hibernate 则是一个强大的 ORM 框架,用于管理数据库交互。将两者结合使用,可以极大提升开发效率并构建高性能的现代 Java 应用。本文将通过代码示例展示如何在 Spring Boot 项目中集成 Hibernate,并实现基本的数据库操作,包括添加依赖、配置数据源、创建实体类和仓库接口,以及在服务层和控制器中处理 HTTP 请求。这种组合不仅简化了配置,还提供了一套强大的工具来快速开发现代 Java 应用程序。
62 0
|
2月前
|
数据库 Java 数据库连接
Struts 2 与 Hibernate 的完美邂逅:如何无缝集成两大框架,轻松玩转高效 CRUD 操作?
【8月更文挑战第31天】本文通过具体示例介绍了如何在 Struts 2 中整合 Hibernate,实现基本的 CRUD 操作。首先创建 Maven 项目并添加相关依赖,接着配置 Hibernate 并定义实体类及其映射文件。然后创建 DAO 接口及实现类处理数据库操作,再通过 Struts 2 的 Action 类处理用户请求。最后配置 `struts.xml` 文件并创建 JSP 页面展示用户列表及编辑表单。此示例展示了如何配置和使用这两个框架,使代码更加模块化和可维护。
41 0
|
2月前
|
消息中间件 安全 Java
Spring Boot 基于 SCRAM 认证集成 Kafka 的详解
【8月更文挑战第4天】本文详解Spring Boot结合SCRAM认证集成Kafka的过程。SCRAM为Kafka提供安全身份验证。首先确认Kafka服务已启用SCRAM,并准备认证凭据。接着,在`pom.xml`添加`spring-kafka`依赖,并在`application.properties`中配置Kafka属性,包括SASL_SSL协议与SCRAM-SHA-256机制。创建生产者与消费者类以实现消息的发送与接收功能。最后,通过实际消息传递测试集成效果与认证机制的有效性。
|
2月前
|
人工智能 Java API
JeecgBoot 低代码平台快速集成 Spring AI
Spring 通过 Spring AI 项目正式启用了 AI(人工智能)生成提示功能。本文将带你了解如何在 Jeecg Boot 应用中集成生成式 AI,以及 Spring AI 如何与模型互动,包含 RAG 功能。
101 3
|
2月前
|
XML Java 数据库连接
Spring Boot集成MyBatis
主要系统的讲解了 Spring Boot 集成 MyBatis 的过程,分为基于 xml 形式和基于注解的形式来讲解,通过实际配置手把手讲解了 Spring Boot 中 MyBatis 的使用方式,并针对注解方式,讲解了常见的问题已经解决方式,有很强的实战意义。在实际项目中,建议根据实际情况来确定使用哪种方式,一般 xml 和注解都在用。
|
2月前
|
自然语言处理 安全 Java
Spring Boot中集成Lucence
本节课首先详细的分析了全文检索的理论规则,然后结合 Lucene,系统的讲述了在 Spring Boot 的集成步骤,首先快速带领大家从直观上感受 Lucene 如何建立索引已经如果检索,其次通过中文检索的具体实例,展示了 Lucene 在全文检索中的广泛应用。Lucene 不难,主要就是步骤比较多,代码不用死记硬背,拿到项目中根据实际情况做对应的修改即可。
下一篇
无影云桌面