新建模型
1.新建模型页面和模型保存
官方demo中的新建模型页面如下图所示,需自行实现
Activiti Model对应的数据表结构如下
由官方demo做的测试数据可知,meta_info_
字段保存了模型名称
、模型版本好
、模型描述
说明:
1.由于仅整合Activiti Modeler
,故在新设计的新建模型界面不必提供设计器选择
2.在新设计的新建模型界面新增输入框用于设置key_
字段(建议)
官方demo将模型新增的业务逻辑放在了创建按钮的点击事件中
在项目中新建名为spring.activiti.model
的package
,并创建名为ModelController
的class
if (selectEditorComponent.isModelerPreferred()) { //... }
将if
分支中的代码移到ModelController#createModel()
中,调整后的代码如下:
package spring.activiti.Model.web;import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.activiti.editor.constants.ModelDataJsonConstants;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Model;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import spring.activiti.Model.pojo.ModelEntity;import javax.servlet.http.HttpServletRequest;
import java.io.UnsupportedEncodingException;/*** Created by liuquan on 2018/4/15.*/
@Controller
@RequestMapping(value = "/ModelController")
public class ModelController {
@Autowiredprivate RepositoryService repositoryService;@Autowiredprivate ObjectMapper objectMapper;@RequestMapping(value = "/createModel.json", method = {RequestMethod.POST})@ResponseBodypublic ObjectNode createModel(ModelEntity modelEntity, HttpServletRequest request) {ObjectNode result = objectMapper.createObjectNode();try {String modelName = modelEntity.getModelName();String modelKey = modelEntity.getModelKey();String modelDescription = modelEntity.getModelDescription();System.out.println(modelName);ObjectNode editorNode = objectMapper.createObjectNode();editorNode.put("id", "canvas");editorNode.put("resourceId", "canvas");ObjectNode stencilSetNode = objectMapper.createObjectNode();stencilSetNode.put("namespace", "http://b3mn.org/stencilset/bpmn2.0#");editorNode.put("stencilset", stencilSetNode);ObjectNode modelObjectNode = objectMapper.createObjectNode();modelObjectNode.put(ModelDataJsonConstants.MODEL_NAME, modelName);//模型名称modelObjectNode.put(ModelDataJsonConstants.MODEL_REVISION, 1);//模型版本modelObjectNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION, modelDescription);Model modelData = repositoryService.newModel();modelData.setMetaInfo(modelObjectNode.toString());modelData.setName(modelName);modelData.setKey(modelKey);repositoryService.saveModel(modelData);repositoryService.addModelEditorSource(modelData.getId(), editorNode.toString().getBytes("utf-8"));result.put("modelId", modelData.getId());} catch (UnsupportedEncodingException e) {e.printStackTrace();}return result;}
}
URL url = new URL(explorerURL.getProtocol(), explorerURL.getHost(), explorerURL.getPort(),explorerURL.getPath().replace("/ui", "") + "modeler.html?modelId=" + modelData.getId());
官方demo中保存完成后直接打开model.html
,而我这里是直接返回json
对象,此处具体如何操作可根据实际情况进行调整。跳转到modeler.html
时需要带上modelId
参数
2.单元测试
package spring.activiti.Model.controller;/*** Created by liuquan on 2018/4/19.*/import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.ResultActions;
import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;@RunWith(SpringRunner.class)
@ContextConfiguration(locations = {
"classpath:spring/applicationContext.xml","classpath:activiti-custom-context.xml","classpath:activiti-mvc.xml"})
@WebAppConfiguration
public class TestModelController {
@Autowiredprivate WebApplicationContext webApplicationContext;private MockMvc mockMvc;@Beforepublic void setUp() throws Exception {mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();}@Testpublic void createModel() throws Exception {MockHttpServletRequestBuilder mockHttpServletRequestBuilder = MockMvcRequestBuilders.post("/ModelController/createModel.json");mockHttpServletRequestBuilder.contentType(MediaType.APPLICATION_FORM_URLENCODED);mockHttpServletRequestBuilder.param("modelName", "贷款申请").param("modelKey", "money").param("modelDescription","这是一个关于贷款申请的流程");ResultActions resultActions = mockMvc.perform(mockHttpServletRequestBuilder);resultActions.andExpect(status().isOk());
// resultActions.andDo(print());String responseStr = resultActions.andReturn().getResponse().getContentAsString();System.out.println(responseStr);}
}
输出如下:
新建成功,但出现了中文乱码问题
关于此处出现乱码的原因说明
<!-- 声明数据源 -->
<bean name="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"p:driverClassName="com.mysql.jdbc.Driver"p:url="jdbc:mysql://127.0.0.1/part01?useUnicode=true&characterEncoding=utf-8"p:username="root"p:password="123456"/>
在applicationContext.xml
文件中通过如上方式配置数据源,保存数据不会出现中文乱码情况。
但将数据库配置信息迁移到db.properties
文件中后,保存数据出现中文乱码,文件内容如下
db=mysql
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1/part01?useUnicode=true&characterEncoding=utf-8
jdbc.username=root
jdbc.password=123456
将&
改回&
后,乱码问题解决