如何使用插件生成自定义Java 8代码
大多數(shù)程序員討厭的一件事就是編寫樣板代碼。 無休止的時間花費在設(shè)置實體類和配置數(shù)據(jù)庫連接上。 為了避免這種情況,您可以讓Speedment Open Source之類的程序為您生成所有這些代碼。 這樣可以很容易地以最少的人工就可以啟動和運行數(shù)據(jù)庫項目,但是當將大部分代碼移交給機器時,如何保持對編寫代碼的控制?
假設(shè)您有一個數(shù)據(jù)庫,該數(shù)據(jù)庫的表“ user”具有“ gender”列,并且您希望將其實現(xiàn)為java中的枚舉。 如果運行Speedment并將其用于生成代碼,則“性別”字段將表示為字符串。 這樣做的原因是,沒有任何內(nèi)置映射器可以在數(shù)據(jù)庫ENUM和自定義Java類之間進行轉(zhuǎn)換。 在這種情況下,您可能會感覺到生成器正在為您帶來控制權(quán)。 好吧,不用擔心,因為從2.3 Hamilton版本開始 ,您可以通過為Speedment創(chuàng)建自己的插件來獲得相同的控件!
本文的目標
在此示例中,我們有一個數(shù)據(jù)庫架構(gòu),其中包含一個名為“ Person”的表。 一個人有一個ID,一個名字和一個性別。 性別聲明為帶有三個可能值的ENUM:“男”,“女”和“其他”。 如果我們使用Speedment中的默認設(shè)置來生成此類,Speedment將把ENUM視為字符串。 但是有一些問題。 例如,如果您想將一個新的人保留到數(shù)據(jù)庫中,則沒有什么可以阻止您在插入時將性別拼寫錯誤并獲得異常。 相反,我們想使用指定的替代方法將java枚舉定義為常量。 是什么使生成的代碼更安全且更易于使用。
我們可以使用Speedment插件來實現(xiàn)這一目標!
創(chuàng)建插件項目
要對Speedment平臺進行任何自定義修改,我們將需要定義一個插件。 插件是一種軟件,可以從pom.xml文件插入Speedment運行時。 該插件位于其自己的Maven項目中,并且可以在項目之間共享。
首先創(chuàng)建一個新的Maven項目,然后將Speedment聲明為依賴項。 在此項目中,您不需要speedment-maven-plugin。
<dependency><groupId>com.speedment</groupId><artifactId>speedment</artifactId><version>${speedment.version}</version> </dependency>插件系統(tǒng)圍繞兩個界面展開; Component和ComponentConstructor。 組件是可插入的軟件,可以作為Speedment生命周期的一部分執(zhí)行。 每個組件都具有允許執(zhí)行的多個階段。 這些是“初始化”,“加載”,“解析”和“開始”。
ComponentConstructor是一種輕型類型,具有默認構(gòu)造函數(shù)和用于初始化自定義組件新實例的方法。 maven插件使用它來設(shè)置新代碼。
這是我們的兩個實現(xiàn)的外觀:
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);} }現(xiàn)在,我們有了一個準插件,可以將其添加到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;} }如果將枚舉值以大寫形式存儲在數(shù)據(jù)庫中,則該類可能會短得多,因為您可以簡單地使用Enum.name()方法來獲取數(shù)據(jù)庫名稱,但是如果您希望靈活地命名,則此方法更好常數(shù)。
現(xiàn)在到最后一塊。 我們需要在Speedment中聲明一個實現(xiàn)TypeMapper接口的類型。 類型映射器確實很簡單。 它包含用于映射到數(shù)據(jù)庫類型和從數(shù)據(jù)庫類型映射的兩種方法,以及用于檢索這兩種類型的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()方法從前面創(chuàng)建的組件中執(zhí)行此操作:
CustomMappingComponent.java
@Override public void onResolve() {// Resolve logic here...getSpeedment().getTypeMapperComponent().install(StringToGenderMapper::new); }我們的新插件現(xiàn)已完成! 構(gòu)建項目,您就可以開始了!
使用插件
要在項目中使用插件,只需修改該項目的pom.xml文件。 打開一個現(xiàn)有的Speedment項目并找到pom.xml文件。 在其中,您應(yīng)該能夠找到speedment-maven-plugin。 為了使您自己的插件可用于maven插件,您需要將其作為依賴項添加到<plugin> -tag內(nèi),并將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>嘗試一下
而已! 插件已安裝! 如果要將特定的列映射到性別而不是字符串,則可以進入用戶界面,導(dǎo)航到“項目樹”中的特定列,然后在下拉列表中選擇新的類型映射器。
如果要查看加載到平臺中的所有組件和/或類型映射器的列表,還可以在UI中轉(zhuǎn)到“關(guān)于”→“組件...”。 在那里您應(yīng)該看到新的組件。
摘要
在本文中,您學(xué)習了如何為Speedment創(chuàng)建自定義插件,該插件將新的Type Mapper從String集成到Gender枚舉。 您還學(xué)習了如何查看將哪些組件加載到平臺中以及如何選擇要用于每一列的類型映射器。
PS:如果您為Speedment項目創(chuàng)建了一些很棒的新映射器,請考慮在我們的Gitter聊天中與社區(qū)共享它們!
翻譯自: https://www.javacodegeeks.com/2016/04/generate-customized-java-8-code-plugins.html
總結(jié)
以上是生活随笔為你收集整理的如何使用插件生成自定义Java 8代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何设置笔记本电脑内外网同时访问电脑如何
- 下一篇: 使用Java 8 Lambda简化嵌套循