Springmvc整合activity的步骤和遇到的问题总结
1、引入相关的maven依赖包
1.1Jackson
主要作用的使用ObjectMapper组装和返回json格式的数据
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.7</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.7</version>
</dependency>
1.2、Activiti6.0版本
工作流核心
<properties>
<activiti.version>6.0.0</activiti.version>
</properties>
<!-- Activiti -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter-basic</artifactId>
<version>${activiti.version}</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-json-converter</artifactId>
<version>${activiti.version}</version>
</dependency>
1.3、添加控制器、前端页面、editor等相关文件信息
a.文件夹说明:
configuration:设计器的属性配置及工具栏和后台交互(重点)
css:样式文件
editor:activiti设计器的oryx插件基于做的流程拖拽
fonts:字体
i18n:国际化文件
images:图片
lib:引用angular,bootstrap等ui,js的文件
partials:左侧元素选项栏的html文件
popups:弹出框的html,保存,修改元素等html
stencilsets:bpmn各种元素图标,(svg放在配置文件)
b.主要文件说明:
stencilset.json:定义元素的属性,规则的配置文件,页面的展示就是根据这个配置文件
editor.html:定义了这个页面的布局,顶部,左侧的工具栏,右侧的画布和元素属性编辑栏
app-cfg.js : 配置调用接口的地址
app.js :angularJS的入口文件,注入需要使用的模块,以及国际化和请求模型json信息
stencil-controller.js:编辑窗口的控制器,包括了元素的快捷方式,元素的属性保存updatePropertyInModel
toolbar-controller.js:定义快捷键对应工具栏的按钮
configuration\properties.js :定义各属性的读取写入的html配置
configuration\url-config.js :定义接口的相应地址(平常做集成到自己系统主要看这里,实现这2个接口即可)
c.配置文件说明
--属性的定义
"propertyPackages" : [ {
"name" : "process_idpackage",
"properties" : [ {
"id" : "name", ---id
"type" : "String", --类型,在赋值的时候会根据类型展示各种输入框,根据properties.js
"title" : "名称", --显示的标题
"value" : "", --值
"description" : "BPMN元素的描述性名称.", --描述
"category":"property", --分类,空的话位popular
"popular" : true, --是否显示
"refToView" : "text_name" --触发svg里面的效果
}]
--节点的定义
"type" : "node",
"id" : "MailTask",
"title" : "邮件任务",--标题
"description" : "邮件任务", --描述
"view" : "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n</svg>", --svg的xml
"icon" : "activity/list/type.send.png", --图标
"groups" : [ "任务" ], --归属的组
"propertyPackages" : [ "overrideidpackage" ],--属性
"hiddenPropertyPackages" : [ ],
"roles" : [ "Activity" ] --规则
d.代码顺序:
modeler.html->editor.html->app.js/stencil-controller.js->properties.js->oryx.debug.js(核心代码,每个版本都是基于这个做封装)
e.总结:
整个设计器其实都是基于oryx.debug.js做了一层扩展,扩展的代码量不多,使用了angularJS,大家在看的时候应该也很容易看懂。
2、添加配置文件信息
2.1 添加spring-activiti.xml配置文件信息
<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.xsd">
<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
<property name="databaseSchemaUpdate" value="create-drop"></property>
<property name="dbHistoryUsed" value="false"></property>
</bean>
</beans>
2.2 添加jackson配置文件信息
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<bean id="handlerAdapter"
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
</list>
</property>
</bean>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=utf-8</value>
</list>
</property>
</bean>
</list>
</property>
</bean>
<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
<bean class="org.springframework.http.converter.FormHttpMessageConverter"/>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean>
</list>
</property>
</bean>
2.3 添加web.xml配置文件信息
对于提交保存的PUT请求,后台无法获取参数的问题解决
<filter>
<filter-name>HttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3、踩坑总结
3.1 关于RequestMapping返回json数据异常问题
问题描述:获取模板的json数据加载配置界面一直报JavaScript错误,最终定位到是控制器返回的数据内容类型和前端调用不匹配导致:
@RequestMapping("/editor/stencilset")
返回string格式的json数据,前端获取到的数据类型为application/text,导致数据无法解析,在不改变核心JavaScript的前提下,对返回的数据类型进行整改,注意这里返回的字符编码是gb2312如果是utf-8会出现中文乱码。
@RequestMapping("/editor/stencilset")
public void getStencilset(HttpServletRequest request, HttpServletResponse response) {
InputStream stencilsetStream = this.getClass().getResourceAsStream("/stencilset.json");
response.setContentType("application/json");
response.setCharacterEncoding("gb2312");
try(OutputStream ros = response.getOutputStream()) {
String temp = IOUtils.toString(stencilsetStream, "utf-8");
IOUtils.write(temp, ros);
ros.flush();
} catch (IOException e) {
throw new ActivitiException("Error while loading stencil set", e);
}
}
3.2 关于编辑完成后点击提交异常错误的问题
前端使用PUT方法进行提交,由于springmvc对于PUT方法处理机制问题,导致无法获取参数信息,在web.xml中添加对PUT请求方法的转换处理,在控制器上添加额外的参数处理方式
/**
* 保存
*
* @param modelId
* @param name
* @param jsonXml
* @param svgXml
* @param description
*/
@RequestMapping(value = "/model/{modelId}/save",method = RequestMethod.PUT)
public void saveModel(@PathVariable String modelId,
@RequestParam(value = "name", required = false) String name,
@RequestParam(value = "json_xml", required = false) String jsonXml,
@RequestParam(value = "svg_xml", required = false) String svgXml,
@RequestParam(value = "description", required = false) String description) {
try {
ObjectMapper objectMapper = new ObjectMapper();
Model model = repositoryService.getModel(modelId);
ObjectNode modelJson = (ObjectNode) objectMapper.readTree(model.getMetaInfo());
modelJson.put("name", name);
modelJson.put("description", description);
model.setMetaInfo(modelJson.toString());
model.setName(name);
repositoryService.saveModel(model);
repositoryService.addModelEditorSource(model.getId(), jsonXml.getBytes(StandardCharsets.UTF_8));
} catch (Exception e) {
throw new ActivitiException("Error saving model", e);
}
}
3.3 添加流程后导出xml的格式文件,放到processes文件夹下无法初始化的问题
由于把数据库之前初始化的记录给清除了,导致后面一直没法初始化模板信息,这个可能是在第一次创建表结构的时候进行的模板初始化,而后续的删除记录导致异常