Autor: Michael Karneim
Projekt-Homepage: http://github.com/mkarneim/pojobuilder
Der PojoBuilder Generator ist ein Java 6-kompatibler Annotationsprozessor, der eine fließende Builder-Klasse für POJOs (Plain Old Java Object) generiert.
Der generierte Builder stellt bereit
Hier ist ein Beispiel dafür, wie Sie einen generierten Pojo-Builder aus Ihrem Code verwenden können:
Contact james = new ContactBuilder ()
. withSurname ( "Bond" )
. withFirstname ( "James" )
. withEmail ( "[email protected]" )
. build ();
Builder sind beispielsweise sehr nützlich, um Testdaten zu erstellen, bei denen Sie nur die relevanten Dateneigenschaften festlegen möchten.
Weitere Informationen zu
Der Quellcode im Verzeichnis „src“ befindet sich in der PUBLIC DOMAIN. Für weitere Informationen lesen Sie bitte die COPYING-Datei.
PojoBuilder ist ein reiner Codegenerator. Es fügt Ihrem Projekt keine Laufzeitabhängigkeiten hinzu.
Allerdings fügt PojoBuilder Ihrem Projekt, das über eine eigene Lizenz verfügt, die folgende Abhängigkeit zur Kompilierungszeit hinzu:
PojoBuilder ist Open Source. Der Quellcode ist unter http://github.com/mkarneim/pojobuilder verfügbar. Ältere Versionen und ein Änderungsprotokoll finden Sie auf der Seite mit dem Versionsverlauf.
PojoBuilder- Binärdateien stehen zum Download im Sonatype OSS Maven Repository und Maven Central zur Verfügung.
Wenn Sie kein Build-Automatisierungstool verwenden, das Maven-Repos unterstützt, möchten Sie möglicherweise pojobuilder-4.3.0-jar-with-dependencies.jar
herunterladen, um PojoBuilder vollständig mit allen abhängigen Bibliotheken zu erhalten.
Der PojoBuilder-Generator verwendet einen Annotationsprozessor, um Pojo-Builder für Sie zu generieren. Um die Codegenerierung anzustoßen, haben Sie folgende Möglichkeiten:
Um eine Builder-Klasse für ein Pojo zu generieren, können Sie einen seiner Konstruktoren mit @GeneratePojoBuilder
annotieren.
Schauen wir uns das folgende Beispiel-Pojo an:
public class Contact {
private final String surname ;
private final String firstname ;
private String email ;
@ GeneratePojoBuilder
public Contact ( String surname , String firstname ) {
this . surname = surname ;
this . firstname = firstname ;
}
public String getEmail () {
return email ;
}
public void setEmail ( String email ) {
this . email = email ;
}
public String getSurname () {
return surname ;
}
public String getFirstname () {
return firstname ;
}
}
Die Annotation @GeneratePojoBuilder weist den Annotationsprozessor an, eine neue Java-Quelldatei mit dem Namen ContactBuilder
zu erstellen. Schauen Sie sich ContactBuilder.java
an, um den generierten Quellcode zu sehen.
Bitte beachten Sie, dass der Konstruktor öffentlich oder anderweitig für den generierten Builder zugänglich sein muss. Wenn er beispielsweise geschützt ist, muss sich der generierte Builder im selben Paket befinden.
Beachten Sie außerdem, dass die Namen der Konstruktorparameter genau mit den Namen der Eigenschaften des Pojos übereinstimmen müssen.
Eine optionale @ConstructorProperties-Annotation kann verwendet werden, um die Zuordnung von den Konstruktorparameternamen zu den entsprechenden Bean-Eigenschaftsnamen im Pojo anzugeben, wenn diese unterschiedlich sind.
public class Contact {
private final String surname ;
private final String firstname ;
private String email ;
@ GeneratePojoBuilder
@ ConstructorProperties ({ "surname" , "firstname" })
public Contact ( String arg1 , String arg2 ) {
this . surname = arg1 ;
this . firstname = arg2 ;
}
public String getEmail () {
return email ;
}
public void setEmail ( String email ) {
this . email = email ;
}
public String getSurname () {
return surname ;
}
public String getFirstname () {
return firstname ;
}
}
Wenn Ihr Pojo keinen Konstruktor (oder einen öffentlichen Standardkonstruktor) hat, können Sie seine Klasse mit @GeneratePojoBuilder
annotieren.
Schauen wir uns das folgende Beispiel-Pojo an:
@ GeneratePojoBuilder
public class User {
private String name ;
private char [] password ;
public String getName () {
return name ;
}
public void setName ( String name ) {
this . name = name ;
}
public char [] getPassword () {
return password ;
}
public void setPassword ( char [] password ) {
this . password = password ;
}
}
Schauen Sie sich UserBuilder.java
an, um den generierten Quellcode zu sehen.
Wenn Sie keinen Zugriff auf den Quellcode des Pojos haben oder kein Fan davon sind, ein Pojo mit Anmerkungen zu versehen, können Sie alternativ eine Factory-Methode mit Anmerkungen versehen:
public class UrlFactory {
@ GeneratePojoBuilder ( withName = "UrlBuilder" , intoPackage = "samples" )
public static URL createUrl (
String protocol , String host , int port , String file , URLStreamHandler handler )
throws MalformedURLException {
return new URL ( protocol , host , port , file , handler );
}
}
Schauen Sie sich UrlBuilder.java
an, um den generierten Quellcode zu sehen.
Bitte beachten Sie, dass die Factory-Methode öffentlich und statisch sein muss. Die Namen der Methodenparameter müssen genau mit den Namen der Pojo-Eigenschaften übereinstimmen.
Eine optionale @FactoryProperties-Annotation kann verwendet werden, um die Zuordnung von den Factory-Method-Parameter-Namen zu den entsprechenden Bean-Property-Namen im Pojo anzugeben, wenn diese unterschiedlich sind.
public class FileFactory {
@ GeneratePojoBuilder ( intoPackage = "samples" )
@ FactoryProperties ({ "path" })
public static File createFile ( String arg1 ) {
return new File ( arg1 );
}
}
Schauen Sie sich FileBuilder.java
an, um den generierten Quellcode zu sehen.
Ab PojoBuilder 4.3 können Sie einen Java 17-Datensatztyp mit Anmerkungen versehen:
@ GeneratePojoBuilder
public record MyRecord ( int x , int y , String blah ) {}
Die folgenden Elemente von @GeneratePojoBuilder können verwendet werden, um die Ausgabe des Codegenerierungsprozesses zu konfigurieren.
Fluent*Builder
zu FluentContactBuilder
wenn der Name des Pojos Contact
lautet. Das Standardmuster ist *Builder
.Visibility.PUBLIC
.*.util
zu com.example.util
, wenn das Paket des Pojos com.example
ist. Das Standardmuster ist *
.Object.class
.Address.java
, Builder.java
und AddressBuilder.java
. Der Standardwert ist Void.class
, was bedeutet, dass keine Schnittstelle implementiert werden sollte.Recipient.java
, Builder.java
und RecipientBuilder.java
. Der Standardwert ist false
.InputSourceFactory.java
und InputSourceBuilder.java
. Der Standardwert ist *
.CalendarFactory.java
und GregorianCalendarBuilder.java
. Standard ist das leere Array.Player.java
, PlayerBuilder.java
und AbstractPlayerBuilder.java
. Der Standardwert ist false
.TextEmail.java
und TextEmailBuilder.java
. Der Standardwert ist false
.com.google.common.base.Optional
und java.util.Optional
von Google Guava, die mit Java 8 eingeführt wurden. Der Standardwert ist Void.class
, was bedeutet, dass keine optional-basierten Setter-Methoden generiert werden.with*
.validate
mit einem Parameter definieren, der mit dem Typ des Pojos kompatibel ist. Wenn die Validierung fehlschlägt, muss die Methode eine Laufzeitausnahme (oder eine ihrer Unterklassen) auslösen. Ein Beispiel finden Sie unter Credentials.java
, CredentialsValidator.java
und CredentialsBuilder.java
.Task.java
und TaskBuilder.java
. Der Standardwert ist ""
was bedeutet, dass diese Methode nicht generiert wird.Ab Version 3 unterstützt PojoBuilder Meta-Anmerkungen . Das heißt, Sie können @GeneratePojoBuilder in einer anderen Annotation platzieren und diese wird vererbt.
Vorteile sind:
Das folgende Beispiel definiert @AppPojo
, das auf Klassenebene angewendet werden kann und die Anmerkungen aus drei verschiedenen Quellen (PojoBuilder, Lombok und JSR-305) kapselt.
@ GeneratePojoBuilder ( withName = "Fluent*Builder" )
@ lombok . experimental . Value // class-level annotation from Lombok
@ javax . annotation . concurrent . Immutable // class-level annotation from JSR-305
@ Target ({ ElementType . TYPE , ElementType . ANNOTATION_TYPE })
public @interface AppPojo {
}
Dies kann auf jedem Ihrer Pojos platziert werden:
@ AppPojo
public class Contact {
public String name ;
}
PojoBuilder generiert FluentContactBuilder
basierend auf den Anweisungen, die von der @AppPojo
-Annotation geerbt wurden.
Von Meta-Annotationen geerbte Standardwerte können durch „lokalere“ @GeneratePojoBuilder
-Annotationen überschrieben werden:
@ AppPojo
@ GeneratePojoBuilder ( intoPackage = "builder" )
public class Contact {
public String name ;
}
Dadurch wird FluentContactBuilder
wie zuvor generiert, jedoch im Paket builder
.
Das PojoBuilder-Wiki bietet ein Kochbuch zur Verwendung des PojoBuilder-Generators, z. B. zum Erstellen einer domänenspezifischen Sprache für automatisierte Tests.
Einige vollständige Codebeispiele finden Sie im Ordner src/testdata/java/samples.
Um den PojoBuilder-Annotationsprozessor auszuführen, müssen Sie ihn lediglich in den Klassenpfad zur Kompilierungszeit einfügen. Zur Laufzeit sind keine Bibliotheken erforderlich, da die Aufbewahrungsrichtlinie der Anmerkungen von PojoBuilder CLASS
ist.
Hier finden Sie eine Liste mit kurzen Beschreibungen zur Ausführung von PojoBuilder
Der javac
-Compiler erkennt automatisch das Vorhandensein von PojoBuilder, wenn pojobuilder-*.jar
im Klassenpfad enthalten ist.
Zum Beispiel:
javac -cp pojobuilder-4.3.0-jar-with-dependencies.jar Contact.java
generiert einen ContactBuilder
, wenn Contact
mit @GeneratePojoBuilder
annotiert ist.
Weitere Informationen finden Sie in der Javac-Dokumentation.
Fügen Sie Folgendes zur pom.xml
Ihres Projekts hinzu, um den PojoBuilder-Annotationsprozessor zu konfigurieren.
net.karneim
pojobuilder
4.3.0
provided
Hinweise:
${project.build.directory}/generated-sources/annotations
.target
aufbewahren müssen, konfigurieren Sie das generatedSourcesDirectory
des maven-compiler-plugin
. Ein Beispiel finden Sie im Beispiel-Maven-Pom.Dies ist ein kleines Build-Skript, das zeigt, wie der PojoBuilder-Annotationsprozessor mit Gradle ausgeführt wird.
apply plugin : ' java '
repositories {
mavenCentral()
}
dependencies {
compile ' net.karneim:pojobuilder:4.3.0 '
}
Bitte beachten Sie, dass dadurch nicht nur der PojoBuilder und seine Abhängigkeiten zu Ihrem Klassenpfad zur Kompilierungszeit, sondern auch zu Ihrem Klassenpfad zur Laufzeit hinzugefügt werden.
Alternativ können Sie das folgende Skript verwenden, um PojoBuilder nur zum Klassenpfad zur Kompilierungszeit hinzuzufügen:
apply plugin : ' java '
repositories {
mavenCentral()
}
configurations {
codeGeneration
}
dependencies {
codeGeneration ' net.karneim:pojobuilder:4.3.0 '
compileOnly ' net.karneim:pojobuilder:4.3.0:annotations '
}
compileJava . classpath + = configurations . codeGeneration
compileTestJava . classpath + = configurations . codeGeneration
In beiden Fällen werden die generierten Quellen im Standardverzeichnis build/classes
abgelegt.
Wenn Sie sie woanders ablegen möchten, geben Sie einfach das Ziel wie folgt an:
compileJava . options . compilerArgs + = [ ' -s ' , ' src/generated/java ' ]
Das Wiki enthält ein erweitertes Gradle-Skript, das vollständig zwischen Codegenerierungs- und Kompilierungsaufgaben unterscheidet.
Es gibt ein weiteres Gradle-Skript, das PojoBuilder für die Eclipse-IDE aktiviert.
Mit Gradle 5.0 werden Annotationsprozessoren im Klassenpfad nicht mehr ausgeführt. Damit pojobuilder wieder funktioniert, ersetzen Sie den verwendeten Abhängigkeitsbereich durch annotationProcessor
dependencies {
annotationProcessor ' net.karneim:pojobuilder:4.3.0 '
}
Hier ist ein Codeausschnitt eines Beispiel-ANT-Build-Skripts, das den PojoBuilder-Annotationsprozessor innerhalb der javac
-Aufgabe ausführt.
< fileset id = " libs.fileset " dir = " ${basedir}/lib " >
< include name = " *.jar " />
fileset >
< path id = " class.path " >
< fileset refid = " libs.fileset " />
path >
< target name = " compile " depends = " init "
description = " Compile java sources and run annotation processor " >
< mkdir dir = " ${src.gen.java.dir} " />
< mkdir dir = " ${build.classes.dir} " />
< javac classpathref = " class.path " destdir = " ${build.classes.dir} " >
< src path = " ${src.main.java.dir} " />
< compilerarg line = " -s ${src.gen.java.dir} " />
javac >
target >
Sie können Eclipse auch so konfigurieren, dass der PojoBuilder-Annotationsprozessor während des Build-Zyklus ausgeführt wird. Es wird immer dann aufgerufen, wenn Sie Dateien speichern, die mit @GeneratePojoBuilder
annotierte Quellen enthalten.
Gehen Sie wie folgt vor, um PojoBuilder für Ihr Eclipse-Projekt zu aktivieren:
pojobuilder-4.3.0-annotations.jar
zu Ihrem Projektklassenpfad hinzupojobuiler-4.3.0-jar-with-dependencies.jar
Wenn Sie die Quellen dieses Projekts selbst kompilieren möchten, können Sie Gradle verwenden (siehe build.gradle).