java代码自动生成的插件_如何使用插件生成自定义Java 8代码

java代码自动生成的插件

大多数程序员讨厌的一件事就是编写样板代码。 无休止的时间花费在设置实体类和配置数据库连接上。 为了避免这种情况,您可以让Speedment Open Source之类的程序为您生成所有这些代码。 这样可以很容易地以最少的人工就可以启动和运行数据库项目,但是当将大部分代码移交给机器时,如何保持对编写代码的控制?

假设您有一个数据库,该数据库的表“ user”具有“ gender”列,并且您希望将其实现为java中的枚举。 如果运行Speedment并将其用于生成代码,则“性别”字段将表示为字符串。 这样做的原因是,没有任何内置映射器可在数据库ENUM和自定义Java类之间进行转换。 这是您可能会觉得发电机正在为您控制的情况之一。 好吧,不用担心,因为从2.3 Hamilton版本开始 ,您可以通过为Speedment创建自己的插件来获得相同的控件!

本文的目标

在此示例中,我们有一个数据库架构,其中包含一个名为“ Person”的表。 一个人有一个ID,一个名字和一个性别。 性别被声明为带有三个可能值的ENUM:“男性”,“女性”和“其他”。 如果我们使用Speedment中的默认设置来生成此类,Speedment将把ENUM视为字符串。 但是有一些问题。 例如,如果要将新人员保留在数据库中,则没有什么可以阻止您在插入时将性别拼写错误并获得异常。 取而代之的是,我们想使用指定的替代方法将java枚举定义为常量。 是什么使生成的代码更安全且更易于使用。

我们可以使用Speedment插件来实现这一目标!

创建插件项目

要对Speedment平台进行任何自定义修改,我们将需要定义一个插件。 插件是一款软件,可以从pom.xml文件插入Speedment运行时。 该插件位于其自己的Maven项目中,并且可以在项目之间共享。

首先创建一个新的Maven项目,然后将Speedment声明为依赖项。 在此项目中,您不需要speedment-maven-plugin。

<dependency><groupId>com.speedment</groupId><artifactId>speedment</artifactId><version>${speedment.version}</version>
</dependency>

插件系统围绕两个界面旋转。 Component和ComponentConstructor。 组件是可插入的软件,可以在Speedment生命周期中执行。 每个组件都具有允许执行的多个阶段。 这些是“初始化”,“加载”,“解析”和“开始”。

ComponentConstructor是一种轻型类型,具有默认构造函数和用于初始化自定义组件新实例的方法。 maven插件使用它来设置新代码。

这是我们的两种实现的外观:

CustomMappingComponent.java

public final class CustomMappingComponent 
extends AbstractComponent {CustomMappingComponent(Speedment speedment) {super(speedment);}@Overridepublic void onResolve() {// Resolve logic here...}@Overridepublic Class<CustomMappingComponent> getComponentClass() {return CustomMappingComponent.class;}@Overridepublic Software asSoftware() {return AbstractSoftware.with("Custom Mapping Component", "1.0", APACHE_2);}@Overridepublic Component defaultCopy(Speedment speedment) {return new CustomMappingComponent(speedment);}
}

CustomMappingComponentInstaller.java

public final class CustomMappingComponentInstaller 
implements ComponentConstructor<CustomMappingComponent> {@Overridepublic Component create(Speedment speedment) {return new CustomMappingComponent(speedment);}
}

现在,我们有了一个准插件,可以将其添加到Speedment项目中。 下一步是定义在字符串和性别之间映射的逻辑。 为此,首先我们需要性别枚举。

Gender.java

public enum Gender {MALE   ("Male"), FEMALE ("Female"),OTHER  ("Other");private final String databaseName;Gender(String databaseName) {this.databaseName = databaseName;}public String getDatabaseName() {return databaseName;}
}

如果将枚举值以大写形式存储在数据库中,则该类可能会短得多,因为您可以简单地使用Enum.name()方法来获取数据库名称,但是如果您希望灵活地命名,则此方法更好常数。

现在到最后一块。 我们需要在Speedment中声明一个实现TypeMapper接口的类型。 类型映射器确实很简单。 它包含两种用于映射到数据库类型或从数据库类型映射的方法,以及用于检索两种类型的Java类的方法。

StringToGenderMapper.java

public final class StringToGenderMapper implements TypeMapper<String, Gender> {@Overridepublic Class<Gender> getJavaType() {return Gender.class;}@Overridepublic Class<String> getDatabaseType() {return String.class;}@Overridepublic Gender toJavaType(String value) {if (value == null) {return null;} else {return Stream.of(Gender.values()).filter(g -> g.getDatabaseName().equals(value)).findAny().orElseThrow(() -> new UnsupportedOperationException("Unknown gender '" + value + "'."));}}@Overridepublic String toDatabaseType(Gender value) {if (value == null) return null;else return value.getDatabaseName();}@Overridepublic boolean isIdentityMapper() {return false;}
}

此新的映射器也需要安装在Speedment平台中。 我们可以通过修改onResolve()方法从前面创建的组件中执行此操作:

CustomMappingComponent.java

@Override
public void onResolve() {// Resolve logic here...getSpeedment().getTypeMapperComponent().install(StringToGenderMapper::new);
}

我们的新插件现已完成! 构建项目,您就可以开始了!

使用插件

要在项目中使用插件,只需修改该项目的pom.xml文件。 打开一个现有的Speedment项目并找到pom.xml文件。 在其中,您应该能够找到speedment-maven-plugin。 为了使您自己的插件可供Maven插件访问,您需要将其作为依赖项添加到<plugin> -tag内,并将ComponentInstaller添加到配置中。 这是它的外观示例:

pom.xml

<plugin><groupId>com.speedment</groupId><artifactId>speedment-maven-plugin</artifactId><version>${speedment.version}</version><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><!-- Our plugin project --><dependency><groupId>com.github.pyknic</groupId><artifactId>custom-mapping-component</artifactId><version>1.0.0-SNAPSHOT</version></dependency></dependencies><configuration><components><!-- Path to the component installer --><component implementation="
com.github.pyknic.salesinfo.plugin.CustomMappingComponentInstaller" /></components></configuration>
</plugin>

您还需要将项目添加为运行时依赖项,因为必须可以从生成的代码访问新的Gender枚举。

<dependencies>...<dependency><groupId>com.github.pyknic</groupId><artifactId>custom-mapping-component</artifactId><version>1.0.0-SNAPSHOT</version></dependency>...
</dependencies>

尝试一下

而已! 插件已安装! 如果要将特定的列映射到性别而不是字符串,则可以进入用户界面,导航到“项目树”中的特定列,然后在下拉列表中选择新的类型映射器。

Select_TypeMapper

如果要查看加载到平台中的所有组件和/或类型映射器的列表,还可以在UI中转到“关于”→“组件...”。 在那里您应该看到新的组件。

组件插件

摘要

在本文中,您学习了如何为Speedment创建自定义插件,该插件将新的Type Mapper从String集成到Gender枚举。 您还了解了如何查看将哪些组件加载到平台中以及如何选择要用于每一列的类型映射器。

PS:如果您为Speedment项目创建了一些很棒的新映射器,请考虑在我们的Gitter聊天中与社区共享它们!

翻译自: https://www.javacodegeeks.com/2016/04/generate-customized-java-8-code-plugins.html

java代码自动生成的插件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/336421.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP在Tomcat中CSS出错,tomcat找不到css怎么办

tomcat找不到css怎么办Tomcat找不到WEB下的Css文件&#xff0c;一般可以通过以下方式解决&#xff1a;将路径相对位置修改为域相对位置&#xff0c;如下&#xff1a;备注&#xff1a;WEB-INF不是公共访问目录&#xff0c;只有在Servlets的RequestDispatcher或JSPS的可以访问&am…

eve模拟器_《Re:从零开始的新伊甸征程》一步到位教你下载EVE手游

自从小生发布了《「EVE Echoes」萌新向完全入门指南》后有小伙伴回应不懂怎样下载游戏的问题&#xff0c;小生作为殷郡中的一名闲云野鹤也尽一点绵薄之力帮助各位&#xff0c;尽量为各位扫清前往新伊甸的“石头”吧。[酷]在开篇前小生可以大致明确告诉你&#xff0c;不要问小生…

【开源项目】QT OPENGL 与 shader 绘制展示视频代码实例 OPenGL直接显示YUV数据

本文使用QT中的QOpenGLFunctions&#xff08;此类封装了OPenGL的方法&#xff0c;相当于QT版OPenGL&#xff09; 其次重载 void paintGL(); void initializeGL(); void resizeGL(int width, int height);是基本操作 * 三种GLSL变量说明 * varying 顶点与片元共享 * attri…

java开发课程表_展示Java开发人员课程包

java开发课程表60个小时以上的课程&#xff0c;5门所有级别的课程&#xff1a;成为Java编程专家 嘿&#xff0c;怪胎&#xff0c; 本周&#xff0c;在我们的JCG Deals商店中 &#xff0c;我们提供了一个极端的报价 。 我们提供的Java Developer Course Bundle 仅售39美元&am…

二阶自回归过程matlab,时间序列分析:二阶自回归过程

时间序列分析&#xff1a;二阶自回归过程Author: nex3z2019-07-131. 定义对于二阶自回归过程 $AR(2)$\begin{equation}X_t \phi_1 X_{t-1} \phi_2 X_{t-2} e_t \tag{1}\end{equation}假设 $e_t$ 独立于 $Y_{t-1}, Y_{t-2}, \cdots$。式 $(1)$ 也可以表示为\begin{equation}X…

m4s格式转换mp3_mp4怎么转换成mp3格式?mp4转mp3的傻瓜式方法

原标题&#xff1a;mp4怎么转换成mp3格式&#xff1f;mp4转mp3的傻瓜式方法或许对于很多小伙伴来说&#xff0c;要将视频改变一下格式就已经很难了&#xff0c;又何况是要将原本的视频改变成音频格式呢&#xff1f;一个是视频&#xff0c;一个是音频&#xff0c;压根就是风马牛…

Git安装及基本操作

1.安装Git 配置用户 git config --global user.name "用户名" git config --global user.email "邮箱"配置完成后查看配置 git config -l生成SSH秘钥 ssh-keygen -t rsa -C “邮箱” 输入完成后需要按3次Enter键 $ ssh-keygen -t rsa -C "邮箱&quo…

ZigBee网络数据传递流程_蓝牙、Wifi与ZigBee三种,这三种无线传输技术,谁能一统天下...

智能产品种类越来越多&#xff0c;运用在智能家居上的技术也越来越成熟。然而在无线通信协议上却一直无法做到统一&#xff0c;从目前的情况来看&#xff0c;短期内是无法实现这一愿望的了。既然如此&#xff0c;我们何不另辟蹊径&#xff0c;在这些标准中&#xff0c;选择优势…

千元平板电脑排行榜_最值得买的平板电脑推荐-最佳平板电脑品牌排行榜【2020年10月】...

平板电脑相较笔记本电脑而言&#xff0c;以其便携与功能强大的特点成为大家日常生活和工作的必备搭档&#xff0c;无论在性能配置上还是在内置软件应用方面&#xff0c;不同的使用场景有不同的需求。今天给大家推荐最佳平板电脑品牌排行&#xff0c;希望对大家选购平板电脑有帮…

java 枚举 菜鸟_2个菜鸟Java常量和枚举陷阱

java 枚举 菜鸟在对Java和Groovy代码进行的各种代码审查中&#xff0c;我经常看到魔术数字和其他随机字符串散落在整个代码库中。 例如&#xff0c;下面的&#xff08;Groovy&#xff09;代码段中的4.2是一个神奇的数字&#xff1a; if (swashbuckle > 4.2) {... }4.2是什…

python正则_python的正则表达式

上次小编写了正则表达式的用法&#xff0c;今天就小编就讲讲正则表达式再python中的应用&#xff0c;在python中想使用正则表达式就需要导入re模块。接下来小编将先介绍re模块中几个常见的函数findall:re.findall(‘正则表达式’&#xff0c;‘待匹配的内容’)例1&#xff1a;输…

公里与英里的换算c语言函数_60迈=60码=60公里?这三者天壤之别,可别搞错了

说到行车速度&#xff0c;大家经常用的是这三个单位&#xff1a;码、迈、公里/时&#xff0c;很多人以为这三者是同一个意思&#xff0c;都是每小时多少公里。实际上这三者并不等同&#xff0c;下面小编科普一下这几个词的差异。码1码不等于1公里&#xff0c;而是等于0.9144米&…

php3.2.3分组查询,ThinkPHP3.2.3版本如何设置应用分组

鑫强已经解决了我的解决方法是创建两个入口文件实际上我的目的就是想要达到两个模块共用一个配置文件和公共函数文件我的解决方法是在项目根目录下建立两个入口文件一个是Index.php与Root.php两个入口文件其中是这样写的Index.php{<?php #前台入口文件 header(Conte…

C++ 11 深度学习(一)auto、头文件防卫、引用、常量

1.数组初始化 int a[]{ 1,2,3,4,5 }; 2.C11 auto auto可以在声明变量的时候根据变量的初始值的类型自动为此变量先择合适的类型&#xff0c;声明时要赋予初值。 auto自动推导发生在编译期间 auto A 10;//A会被自动推导为int类型 3.头文件防卫式声明 作用:防止头文件重…

android 在什么情况下会主动gc_Python 什么情况下会生成 pyc 文件?

作者&#xff1a;折木奉太郎(经授权转载)来源&#xff1a;https://www.zhihu.com/question/30296617/answer/112564303作为 Python 爱好者&#xff0c;需要了解 .py 脚本的基本运行机制及特性&#xff1a;在很多工作上&#xff0c;Python 的运行流程基本上取决于用户&#xff0…

【IP协议头分析】

Version 版本号 IHL IP头长度 Type of Service Total Length 总长度 Identification 拆包的唯一标识 Flags 1位保留 &#xff0c; 2位 允许拆包 3位 不允许拆包 Fragment offset 在原包偏移量 Time to Live 时间或路由跳数 Protocol IP中是什么协议类型 Header Check…

乡村野生草药_官方野生蝇群流口水分数

乡村野生草药官方是什么&#xff1f; 标题太小&#xff0c;但有用的贡献。 Wildfly Swarm允许我们创建相当小的自包含应用程序&#xff0c;包括我们从Wildfly Application Server中需要的应用程序。 在这篇文章中&#xff0c;我们将研究与Wildfly Swarm合作使用的Drools分数 。…

obs多推流地址_(无人直播)教程利用OBS推流抖音直播电脑屏幕或PC游戏

目前的火爆程度相信大家都有目共睹&#xff0c;也為部分活躍用戶提供直播功能&#xff0c;開通直播的方法有&#xff1a;①粉絲達到10000粉絲&#xff0c;官方會自動邀請妳開通直播權限。②加入和官方合作的工會&#xff0c;無需粉絲&#xff0c;也可以開通直播權限。開通直播功…