解决Activiti Modeler 部署中文流程 报错问题

来源:互联网 发布:网络教学英语作文优点 编辑:程序博客网 时间:2024/05/29 14:34

解决Activiti Modeler 部署中文流程 报错问题

原创 2013年10月21日 11:15:38

我的Activti 版本是5.13

在画流程图的时候 含有中文的流程图无法部署,看了半天源代码。直接把流程图转成base64来解决。

1.在Modeler 保存流程是调用方法org.activiti.editor.rest.model.ModelSaveRestResource

下面是修改后的完整代码 json_xml传递过来发现是gbk的,这里我转成utf8 然后在进行base64编码。

[java] view plain copy
  1. /* Licensed under the Apache License, Version 2.0 (the "License"); 
  2.  * you may not use this file except in compliance with the License. 
  3.  * You may obtain a copy of the License at 
  4.  *  
  5.  *      http://www.apache.org/licenses/LICENSE-2.0 
  6.  *  
  7.  * Unless required by applicable law or agreed to in writing, software 
  8.  * distributed under the License is distributed on an "AS IS" BASIS, 
  9.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
  10.  * See the License for the specific language governing permissions and 
  11.  * limitations under the License. 
  12.  */  
  13. package org.activiti.editor.rest.model;  
  14.   
  15. import java.io.ByteArrayInputStream;  
  16. import java.io.ByteArrayOutputStream;  
  17. import java.io.InputStream;  
  18.   
  19. import org.activiti.editor.constants.ModelDataJsonConstants;  
  20. import org.activiti.engine.ProcessEngines;  
  21. import org.activiti.engine.RepositoryService;  
  22. import org.activiti.engine.repository.Model;  
  23. import org.apache.batik.transcoder.TranscoderInput;  
  24. import org.apache.batik.transcoder.TranscoderOutput;  
  25. import org.apache.batik.transcoder.image.PNGTranscoder;  
  26. import org.codehaus.jackson.map.ObjectMapper;  
  27. import org.codehaus.jackson.node.ObjectNode;  
  28. import org.restlet.data.Form;  
  29. import org.restlet.data.Status;  
  30.   
  31. import org.restlet.resource.Put;  
  32. import org.restlet.resource.ServerResource;  
  33. import org.slf4j.Logger;  
  34. import org.slf4j.LoggerFactory;  
  35.   
  36. import sun.misc.BASE64Encoder;  
  37. /** 
  38.  * @author Tijs Rademakers 
  39.  */  
  40. public class ModelSaveRestResource extends ServerResource implements  
  41.         ModelDataJsonConstants {  
  42.   
  43.     protected static final Logger LOGGER = LoggerFactory  
  44.             .getLogger(ModelSaveRestResource.class);  
  45.   
  46.     @Put  
  47.     public void saveModel(Form modelForm) {  
  48.         ObjectMapper objectMapper = new ObjectMapper();  
  49.         String modelId = (String) getRequest().getAttributes().get("modelId");  
  50.         // System.out.println("json " + modelForm.getFirstValue("json_xml"));  
  51.   
  52.         try {  
  53.   
  54.             /* 
  55.              * ObjectNode modelNode = (ObjectNode) 
  56.              * objectMapper.readTree(modelForm.getFirstValue("json_xml")); 
  57.              * JsonToBpmnExport converter = new JsonToBpmnExport(modelNode); 
  58.              * byte[] bpmnBytes = converter.convert(); 
  59.              * System.out.println("bpmn " + new String(bpmnBytes)); 
  60.              */  
  61.   
  62.             RepositoryService repositoryService = ProcessEngines  
  63.                     .getDefaultProcessEngine().getRepositoryService();  
  64.             Model model = repositoryService.getModel(modelId);  
  65.   
  66.             ObjectNode modelJson = (ObjectNode) objectMapper.readTree(model  
  67.                     .getMetaInfo());  
  68.   
  69.             modelJson.put(MODEL_NAME, modelForm.getFirstValue("name"));  
  70.             modelJson.put(MODEL_DESCRIPTION,  
  71.                     modelForm.getFirstValue("description"));  
  72.             model.setMetaInfo(modelJson.toString());  
  73.             model.setName(modelForm.getFirstValue("name"));  
  74.   
  75.                       
  76.             byte[] svg_xml=modelForm.getFirstValue("svg_xml").getBytes("UTF-8");  
  77.           
  78.               
  79.             //转成UTF-8 然后使用base64编码  
  80.             String gbk=new String(modelForm.getFirstValue("json_xml").getBytes("GBK"));  
  81.             String iso = new String(gbk.getBytes("UTF-8"),"ISO-8859-1");  
  82.             String utf8=new String(iso.getBytes("ISO-8859-1"),"UTF-8");  
  83.             byte[]  json_xml=new BASE64Encoder().encode(utf8.getBytes("UTF-8")).getBytes();  
  84.             repositoryService.addModelEditorSource(model.getId(),json_xml);  
  85.               
  86.               
  87.               
  88.             InputStream svgStream = new ByteArrayInputStream(svg_xml);  
  89.             TranscoderInput input = new TranscoderInput(svgStream);  
  90.   
  91.             PNGTranscoder transcoder = new PNGTranscoder();  
  92.             // Setup output  
  93.             ByteArrayOutputStream outStream = new ByteArrayOutputStream();  
  94.             TranscoderOutput output = new TranscoderOutput(outStream);  
  95.   
  96.             // Do the transformation  
  97.             transcoder.transcode(input, output);  
  98.             final byte[] result = outStream.toByteArray();  
  99.             repositoryService.addModelEditorSourceExtra(model.getId(), result);  
  100.             outStream.close();  
  101.                   
  102.             repositoryService.saveModel(model);  
  103.               
  104.         } catch (Exception e) {  
  105.             LOGGER.error("Error saving model", e);  
  106.             setStatus(Status.SERVER_ERROR_INTERNAL);  
  107.         }  
  108.     }  
  109. }  


2.取流程图的时候调用的是 org.activiti.engine.impl.RepositoryServiceImpl 下面是修改后的代码


[java] view plain copy
  1. public byte[] getModelEditorSource(String modelId) {  
  2.       //修改  
  3.       byte[] json_byte= commandExecutor.execute(new GetModelEditorSourceCmd(modelId));  
  4.    try {  
  5.     if(!new String(json_byte).startsWith("{")){  
  6.               json_byte=new BASE64Decoder().decodeBuffer(new String(json_byte));  
  7.               return json_byte;  
  8.           }  
  9. catch (IOException e) {  
  10.     e.printStackTrace();  
  11. }  
  12.       return json_byte;  
  13. }  


3.发布的时候 String又成了默认编码

org.activiti.editor.ui.EditorProcessDefinitionDetailPanel

String bmpnString=new String(bmpnBytes) 改为String bmpnString=new String(bmpnBytes,“utf-8”)

[java] view plain copy
  1. protected void deployModelerModel(final ObjectNode modelNode) {  
  2.     try {  
  3.         BpmnModel model = new BpmnJsonConverter().convertToBpmnModel(modelNode);  
  4.         byte[] bpmnBytes = new BpmnXMLConverter().convertToXML(model);  
  5.         String bpmnString=new String(bpmnBytes,"UTF-8");  
  6.         String processName = modelData.getName() + ".bpmn20.xml";  
  7.         Deployment deployment = repositoryService.createDeployment()  
  8.                 .name(modelData.getName())  
  9.                //.addString(processName, new String(bpmnBytes))  
  10.                 .addString(processName, bpmnString)  
  11.                 .deploy();  
  12.   
  13.         ExplorerApp.get().getViewManager().showDeploymentPage(deployment.getId());  
  14.     } catch (UnsupportedEncodingException e) {  
  15.         LOGGER.debug("发布流程xml编码错误");  
  16.         e.printStackTrace();  
  17.     }  
  18.   }  

下面是我部署的含有中文的流程



阅读全文
0 0
原创粉丝点击