新建模型
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 {
@Autowired
private RepositoryService repositoryService;
@Autowired
private ObjectMapper objectMapper;
@RequestMapping(value = "/createModel.json", method = {RequestMethod.POST})
@ResponseBody
public 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 {
@Autowired
private WebApplicationContext webApplicationContext;
private MockMvc mockMvc;
@Before
public void setUp() throws Exception {
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}
@Test
public 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
将&
改回&
后,乱码问题解决