西门子低代码开发 - Java Action 泛型
技术背景:
作者使用西门子低代码 Studio pro 最近在做一个项目时,收获了一个比较基础的开发小技巧,有些代码逻辑,需要处理多种类型的Entity Object or Entity List 或者其他类型(String)。因此此时 我们最先想到的做法不是针对每个Entity Object逐一编写相应的Java Action,应该是整理这些需求的逻辑梳理为一个所有Entity都通用的Java Action。
业务价值
- 灵活覆盖及实现业务需求,及业务拓展
- 功能模块组件化,可在多个项目中复用,解决类似或相同的业务问题
- 可作为公司技术资产,组件公司独立的技术组件库
技术价值
- 降低代码耦合,为开发者提供更加广阔的开发视野
- 提高代码结构化,实现一码多用
- 提高项目结构化,打造符合软件工程理论的低耦合,易维护,可扩展的企业级软件应用
基础知识介绍:
在JDK(Java Development Kit)1.5加入了泛型;
泛型,即“参数化类型”。就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。
例如:GenericClass<T>{}
需要详细学习的小伙伴大家可以去 看一下《Java 编程思想》这本书
同时,这里给出一个参考学习Java基础的学习链接:java 泛型全解 - 绝对最详细 - 云+社区 - 腾讯云 (tencent.com)
西门子低代码平台(西门子低代码 Studio Pro)中的泛型
各位读者,阅读到这里,详细大家已经知道泛型是什么,以及能帮助我们在开发过程中做什么事情。若还没有理解这个概念,及实际意义。请先学习了解!
这里有几个基础给概念词汇我根据我的理解给大家解读一下(若不对请留言,我会改正):
- Java Action: 在西门子低代码 Studio Pro 中,提供给开发者写复杂Java代码逻辑的.java文件。
- MicroFlow: 西门子低代码 Studio Pro 中通过拖拉拽,图形化开发后台逻辑的逻辑流,这里简称微流。
- Java Action Call: 可以在MicroFlow中使用拖拽,并选择调用已经创建完成的Java Action。
- 详细的介绍请参考官方的Document Java Actions | Mendix Documentation
首先我们要创建一个Java Action在西门子低代码 Studio Pro 中。
右键点击 任意一个自定义的Module 模块 按照图示创建Java Action
输入名称-这里叫Remove_Duplicate_Elements Java Action

双击选择 刚刚创建的Remove_Duplicate_Elements的Java Action。
选择上方的Type Parameters,创建一个type parameter 输入名称为EntityToJoin(可自定义)。

创建输入Java Action 的参数,使用Type Paremeters中定义的类型。
小编这里创建了3个参数,
名称 | 类型
Entity |(EntitytoJoin)
OElist | EntitytoJoinList
FromPropertiesName | String
小编这里由于输出永远是去重的String的List 所以这里统一创建了一个结果Entity,就是这个ValueObject。
*如果大家输出的Entity也是不固定的话,也可以创建一个Type Parameters 作为输出类型选择,并且在输入参数,添加结果Entity选择

在本次开发主要使用了西门子低代码 Runtime提供的Java API(Mendix API)
Object.getMember()用来根据对象获得他的属性,下面我填入的参数FromPropertiesName是与Object内想对应的属性名称,这样他就可以匹配到需要的属性,我们紧接着用getValue方法获取属性值并转换为String类型。
Core.instantiate() 是用来创建一个IMendixObject泛型下的实体对象,这个代码例子简单来讲就是创建一个这里是ValueObject 类型的Object。
Object.getMember(getContext(), FromPropertiesName).getValue(getContext()).toString()
IMendixObject vo= Core.instantiate(getContext(), ValueObject.getType());
若对Java Action 源码理解有问题:这里提供几个地址供大家学习
Build Microflow Actions| Mendix Documentation (着重参考,2 Creating Generic Action Using Type Parameters)。
Use the Java API | Mendix Documentation(教大家如何使用 Mendix Runtime提供的Java API)
详细细节大家可以看一下这个源码实现。
// This file was generated by Mendix Studio Pro.
//
// WARNING: Only the following code will be retained when actions are regenerated:
// - the import list
// - the code between BEGIN USER CODE and END USER CODE
// - the code between BEGIN EXTRA CODE and END EXTRA CODE
// Other code you write will be lost the next time you deploy the project.
// Special characters, e.g., é, ö, à, etc. are supported in comments.
package dataanalysismodule.actions;
import java.util.*;
import java.util.stream.Collectors;
import com.mendix.core.Core;
import com.mendix.systemwideinterfaces.core.IContext;
import com.mendix.webui.CustomJavaAction;
import dataanalysismodule.proxies.ValueObject;
import com.mendix.systemwideinterfaces.core.IMendixObject;
public class Remove_Duplicate_Elements extends CustomJavaAction<java.util.List<IMendixObject>>
{
private java.lang.String Entity;
private java.util.List<IMendixObject> OEList;
private java.lang.String FromPropertiesName;
public Remove_Duplicate_Elements(IContext context, java.lang.String Entity, java.util.List<IMendixObject> OEList, java.lang.String FromPropertiesName)
{
super(context);
this.Entity = Entity;
this.OEList = OEList;
this.FromPropertiesName = FromPropertiesName;
}
@java.lang.Override
public java.util.List<IMendixObject> executeAction() throws Exception
{
// BEGIN USER CODE
//判断是否为空
if(OEList.isEmpty())
{
return null;
}
//可以用Collection Lambda哈,这里用了最笨的方式做的
List <String> rowlist=new ArrayList<>();
for(IMendixObject i : OEList)
{
if( i.getMember(getContext(), FromPropertiesName).getValue(getContext())!= null)
rowlist.add(i.getMember(getContext(), FromPropertiesName).getValue(getContext()).toString());
}
//处理并获得去重结果
List <String> resultlist = removeDuplicationByTreeSet(rowlist);
//将结果输入数据
List<IMendixObject> voList = new ArrayList<>();
for(String i : resultlist)
{
IMendixObject vo= Core.instantiate(getContext(), ValueObject.getType());
vo.setValue(getContext(), ValueObject.MemberNames.IStringValue.toString(), i);
voList.add(vo);
}
return voList;
// END USER CODE
}
/**
* Returns a string representation of this action
*/
@java.lang.Override
public java.lang.String toString()
{
return "Remove_Duplicate_Elements";
}
// BEGIN EXTRA CODE
/**使用TreeSet实现List去重(有序)
*
* @param list
* */
public static List <String> removeDuplicationByTreeSet(List<String> OHlist) {
List<String> list= new ArrayList<>();
for(String oh:OHlist) {
if(oh!= null && !oh.trim().equals(""))
{
list.add(oh);
}
}
Set<String> Aset = new TreeSet<String>();
//这里要注意当orderList集合大小只有1的时候其实没必要去重,就一个元素还去啥重
//注意点2,虽然比较器中 = 0的会被判定相同,但是Set在去重的时候会按照 orderList 中元素的顺序来去重,可能最后拿到的不是你想要的结果,这里要慎重.比如说我们想要 orderList 去重后 quantity最大的那个元素,但是orderList中 quantity 最小的元素排在第一位,那么后面再根据 自定义的compare比较的时候会把后面我们要的quantity最大的那个元素丢弃掉
//建议只用于去重,不要同时去重和修改数据
Aset.addAll(list);
//把List集合所有元素清空
list.clear();
list.addAll(Aset);
return list;
}
// END EXTRA CODE
}
关于Mendix公司
在一个数字化先行的世界中,客户希望自己的每一项需求都得到满足,员工希望使用更好的工具来完成工作,而企业意识到自己只有通过全面数字化转型才能生存并取得成功。Mendix公司,a Siemens business正在迅速成为企业数字化转型的推动者。其业内领先的低代码平台和全方位的生态系统整合最先进的技术,帮助企业创造出提高互动性、简化操作和克服IT瓶颈的解决方案。Mendix公司以抽象化、自动化、云和协作为四大支柱,大幅提升开发者的生产力,并且依靠自己的工程协作能力和直观的可视化界面,帮助大量不熟悉技术的“公民”开发者在他们所擅长的领域创建应用程序。Mendix公司是权威行业分析师眼中的领导者和远见者,也是一个云原生、开放、可扩展、敏捷和饱经考验的平台。从人工智能和增强现实,到智能自动化和原生移动,Mendix公司已成为数字化先行企业的骨干。Mendix公司企业低代码平台已被全球4000多家领先的公司采用。
感谢阅读!
更多推荐



所有评论(0)