flowable自定義屬性

MarkDown版本:http://www.reibang.com/p/c1fb9324b476

flowable每個節(jié)點(diǎn)自帶的屬性是有限的芽狗,而在實(shí)際業(yè)務(wù)中可能會遇到一些比較適合配置到各個節(jié)點(diǎn)屬性,但是自帶屬性里面又沒有的禁筏,所以這個時(shí)候我們就需要自己自定義屬性了,這里主要記錄下自己處理的過程喷兼,方便以后遇到該問題好查閱碎紊。

修改前端

? ? ?(1).修改文件:stencilset_bpmn.json

? ? ?(2).新增2個屬性:

新增屬性

? ? ?(3).把新增的屬性添加到UserTask 節(jié)點(diǎn)

屬性添加到UserTask節(jié)點(diǎn)

? ? 前端修改之后頁面的效果:

新增自定義屬性的效果

這樣配好之后我們?nèi)ハ螺dxml的時(shí)候會發(fā)現(xiàn)沒有這兩個新增的屬性,這個時(shí)候在流程實(shí)例流轉(zhuǎn)的時(shí)候也是獲取不到新增屬性的值的搞乏。

前端修改之后xml并沒有新增的屬性

是因?yàn)閒lowable并沒有支持自定義屬性的存儲,所以這個時(shí)候就要自己對自定義屬性進(jìn)行解析了戒努。

后端修改

?(1).我們可以從頁面找到下載的請求路徑请敦。可以看到是app/rest/models/**


xml下載的請求路徑

因?yàn)槭窃创a我這邊為了盡量不改他的源碼储玫,所以自己修改了請求地址侍筛,自己寫了下載的實(shí)現(xiàn)。

修改url-config跳轉(zhuǎn)地址:app/rest/models/** 改成? XX/app/rest/models/**

修改xml下載請求路徑

(2).新建ModelController 繼承 AbstractModelBpmnResource:

@RestController

@RequestMapping("/XX/app")

//@Transactional

public class ModelControllerextends AbstractModelBpmnResource {

private static final Logger LOGGER = LoggerFactory.getLogger(ModelController.class);

? ? @Autowired

protected XXModelServiceImpl?xxModelService;

? ? /**

* GET /rest/models/{modelId}/bpmn20 -> Get BPMN 2.0 xml

*/

? ? @RequestMapping(value ="/rest/models/{processModelId}/bpmn20", method = RequestMethod.GET)

public void getProcessModelBpmn20Xml(HttpServletResponse response, @PathVariable String processModelId)throws IOException {

LOGGER.info("開始下載xml文件1");

? ? ? ? if (processModelId ==null) {

throw new BadRequestException("No process model id provided");

? ? ? ? }

Model model = xxModelService.getModel(processModelId);

? ? ? ? generateBpmn20Xml(response, model);

? ? }

protected void generateBpmn20Xml(HttpServletResponse response, AbstractModel model) {

String name = model.getName().replaceAll(" ", "_") +".bpmn20.xml";

? ? ? ? String encodedName =null;

? ? ? ? try {

encodedName ="UTF-8''" + URLEncoder.encode(name, "UTF-8");

? ? ? ? }catch (Exception e) {

LOGGER.warn("Failed to encode name " + name);

? ? ? ? }

String contentDispositionValue ="attachment; filename=" + name;

? ? ? ? if (encodedName !=null) {

contentDispositionValue +="; filename*=" + encodedName;

? ? ? ? }

response.setHeader("Content-Disposition", contentDispositionValue);

? ? ? ? if (model.getModelEditorJson() !=null) {

try {

ServletOutputStream servletOutputStream = response.getOutputStream();

? ? ? ? ? ? ? ? response.setContentType("application/xml");

? ? ? ? ? ? ? ? BpmnModel bpmnModel = xxModelService.getBpmnModel(model);

? ? ? ? ? ? ? ? byte[] xmlBytes = xxModelService.getBpmnXML(bpmnModel);

? ? ? ? ? ? ? ? BufferedInputStream in =new BufferedInputStream(new ByteArrayInputStream(xmlBytes));

? ? ? ? ? ? ? ? byte[] buffer =new byte[8096];

? ? ? ? ? ? ? ? while (true) {

int count = in.read(buffer);

? ? ? ? ? ? ? ? ? ? if (count == -1) {

break;

? ? ? ? ? ? ? ? ? ? }

servletOutputStream.write(buffer, 0, count);

? ? ? ? ? ? ? ? }

// Flush and close stream

? ? ? ? ? ? ? ? servletOutputStream.flush();

? ? ? ? ? ? ? ? servletOutputStream.close();

? ? ? ? ? ? }catch (BaseModelerRestException e) {

throw e;

? ? ? ? ? ? }catch (Exception e) {

LOGGER.error("Could not generate BPMN 2.0 XML", e);

? ? ? ? ? ? ? ? throw new InternalServerErrorException("Could not generate BPMN 2.0 xml");

? ? ? ? ? ? }

}

}

}

(3).新建XXModelServiceImpl 繼承?ModelServiceImpl


(4).新建XXBpmnJsonConverter 繼承 BpmnJsonConverter

(5).新建自定義userTaskjson解析器XXCustomizeUserTaskJsonConverter 繼承UserTaskJsonConverter```public class XXCustomizeUserTaskJsonConverterextends UserTaskJsonConverter {

private static final Logger LOGGER = LoggerFactory.getLogger(XXCustomizeUserTaskJsonConverterextends.class);

? ? private static final String RETURN_TO_THE_SPECIFIED_NODE ="returntothespecifiednode";

? ? private static final String RETURN_TO_THE_SPECIFIED_NODE_KEY ="returnToTheSpecifiedNode";

? ? private static final String APPROVAL_OPERATION ="approvaloperation";

? ? private static final String APPROVAL_OPERATION_KEY ="approvalOperation";

? ? public static void fillBpmnTypes(

Map, Class> convertersToJsonMap) {

convertersToJsonMap.put(UserTask.class, XXCustomizeUserTaskJsonConverter.class);

? ? }

@Override

protected FlowElement convertJsonToElement(JsonNode elementNode, JsonNode modelNode,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Map shapeMap) {

FlowElement flowElement =super.convertJsonToElement(elementNode, modelNode, shapeMap);

? ? ? ? LOGGER.info("進(jìn)入自定義屬性解析");

? ? ? ? if(flowElementinstanceof UserTask){

ObjectMapper objectMapper =new ObjectMapper();

? ? ? ? ? ? UserTask userTask = (UserTask) flowElement;

? ? ? ? ? ? try {

LOGGER.info("節(jié)點(diǎn):" + objectMapper.writeValueAsString(userTask));

? ? ? ? ? ? }catch (JsonProcessingException e) {

LOGGER.error("節(jié)點(diǎn)序列化異常.");

? ? ? ? ? ? }

String? returnToTheSpecifiedNode = getPropertyValueAsString(RETURN_TO_THE_SPECIFIED_NODE, elementNode);

? ? ? ? ? ? LOGGER.info("新增自定義屬性[" + RETURN_TO_THE_SPECIFIED_NODE +"]=" + returnToTheSpecifiedNode);

? ? ? ? ? ? String? approvalOperation = getPropertyValueAsString(APPROVAL_OPERATION, elementNode);

? ? ? ? ? ? LOGGER.info("新增自定義屬性[" + APPROVAL_OPERATION +"]=" + approvalOperation);

? ? ? ? ? ? Map> atts =new HashMap>();

? ? ? ? ? ? ExtensionAttribute ea1 = ExtensionAttributeUtils.generate(RETURN_TO_THE_SPECIFIED_NODE_KEY,returnToTheSpecifiedNode);

? ? ? ? ? ? ExtensionAttribute ea2 = ExtensionAttributeUtils.generate(APPROVAL_OPERATION_KEY,approvalOperation);

? ? ? ? ? ? atts.put("XX-FLOWABLE-EXT ",Arrays.asList(ea1,ea2));

? ? ? ? ? ? flowElement.setAttributes(atts);

? ? ? ? }

return flowElement;

? ? }

}

```



修改代碼重新部署之后再下載xml:

新增屬性存儲到了xml

可以看到新增屬性再xml里面已經(jīng)保存成功了撒穷。



發(fā)起一支流程匣椰,去實(shí)例中看看能不能取到該新增屬性的值。


實(shí)例流程中能獲取到新增屬性的值
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末端礼,一起剝皮案震驚了整個濱河市禽笑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蛤奥,老刑警劉巖佳镜,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異凡桥,居然都是意外死亡啤贩,警方通過查閱死者的電腦和手機(jī)慌随,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門惦银,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绒窑,“玉大人唤崭,你說我怎么就攤上這事拷恨。” “怎么了谢肾?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵腕侄,是天一觀的道長。 經(jīng)常有香客問我,道長冕杠,這世上最難降的妖魔是什么微姊? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮分预,結(jié)果婚禮上兢交,老公的妹妹穿的比我還像新娘。我一直安慰自己笼痹,他們只是感情好配喳,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著凳干,像睡著了一般晴裹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上救赐,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天涧团,我揣著相機(jī)與錄音,去河邊找鬼经磅。 笑死泌绣,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的馋贤。 我是一名探鬼主播赞别,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼配乓!你這毒婦竟也來了仿滔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤犹芹,失蹤者是張志新(化名)和其女友劉穎崎页,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體腰埂,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡飒焦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了屿笼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片牺荠。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖驴一,靈堂內(nèi)的尸體忽然破棺而出休雌,到底是詐尸還是另有隱情,我是刑警寧澤肝断,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布杈曲,位于F島的核電站驰凛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏担扑。R本人自食惡果不足惜恰响,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望涌献。 院中可真熱鬧胚宦,春花似錦、人聲如沸燕垃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽利术。三九已至呈野,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間印叁,已是汗流浹背被冒。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留轮蜕,地道東北人昨悼。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像跃洛,于是被迫代替她去往敵國和親率触。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容