Auteur : Michael Karneim
Page d'accueil du projet : http://github.com/mkarneim/pojobuilder
Le générateur PojoBuilder est un processeur d'annotation compatible Java 6 qui génère une classe de construction fluide pour les POJO (Plain Old Java Object).
Le constructeur généré fournit
Voici un exemple de la façon dont vous pouvez utiliser un générateur pojo généré à partir de votre code :
Contact james = new ContactBuilder ()
. withSurname ( "Bond" )
. withFirstname ( "James" )
. withEmail ( "[email protected]" )
. build ();
Les générateurs sont très utiles, par exemple, pour créer des données de test, pour lesquelles vous souhaitez uniquement définir les propriétés de données pertinentes.
Pour plus d'informations sur
Le code source situé dans le répertoire "src" est dans le DOMAINE PUBLIC. Pour plus d’informations, veuillez lire le fichier COPIE.
PojoBuilder est un pur générateur de code. Il n'ajoute aucune dépendance d'exécution à votre projet.
Cependant, PojoBuilder ajoute la dépendance suivante au moment de la compilation à votre projet, qui possède sa propre licence :
PojoBuilder est Open Source. Le code source est disponible sur http://github.com/mkarneim/pojobuilder. Pour les anciennes versions et un journal des modifications, veuillez consulter la page de l'historique des versions.
Les binaires PojoBuilder sont disponibles en téléchargement sur Sonatype OSS Maven Repository et Maven Central.
Si vous n'utilisez aucun outil d'automatisation de build prenant en charge les dépôts maven, vous souhaiterez peut-être télécharger le pojobuilder-4.3.0-jar-with-dependencies.jar
pour obtenir PojoBuilder complet avec toutes les bibliothèques dépendantes incluses.
Le générateur PojoBuilder utilise un processeur d'annotations pour générer des constructeurs pojo pour vous. Vous disposez des options suivantes pour déclencher la génération de code :
Pour générer une classe de constructeur pour un pojo, vous pouvez annoter l'un de ses constructeurs avec @GeneratePojoBuilder
.
Jetons un coup d'œil à l'exemple de pojo suivant :
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 ;
}
}
L'annotation @GeneratePojoBuilder indique au processeur d'annotation de créer un nouveau fichier source Java portant le nom ContactBuilder
. Jetez un œil à ContactBuilder.java
pour voir le code source généré.
Veuillez noter que le constructeur doit être public ou autrement accessible pour le constructeur généré, par exemple s'il est protégé, le constructeur généré doit résider dans le même package.
Et notez également que les noms des paramètres du constructeur doivent correspondre exactement aux noms des propriétés du pojo.
Une annotation facultative @ConstructorProperties peut être utilisée pour spécifier le mappage des noms de paramètres de constructeur aux noms de propriétés de bean correspondants sur le pojo s'ils diffèrent.
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 ;
}
}
Si votre pojo n'a pas de constructeur (ou un constructeur public par défaut), vous pouvez annoter sa classe avec @GeneratePojoBuilder
.
Jetons un coup d'œil à l'exemple de pojo suivant :
@ 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 ;
}
}
Jetez un œil à UserBuilder.java
pour voir le code source généré.
Alternativement, si vous n'avez pas accès au code source du pojo, ou si vous n'êtes pas fan de l'annotation d'un pojo, vous pouvez annoter une méthode d'usine :
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 );
}
}
Jetez un œil à UrlBuilder.java
pour voir le code source généré.
Veuillez noter que la méthode factory doit être publique et statique . Les noms des paramètres de la méthode doivent correspondre exactement aux noms des propriétés du pojo.
Une annotation facultative @FactoryProperties peut être utilisée pour spécifier le mappage des noms de paramètres de méthode d'usine vers les noms de propriétés de bean correspondants sur le pojo s'ils diffèrent.
public class FileFactory {
@ GeneratePojoBuilder ( intoPackage = "samples" )
@ FactoryProperties ({ "path" })
public static File createFile ( String arg1 ) {
return new File ( arg1 );
}
}
Jetez un œil à FileBuilder.java
pour voir le code source généré.
À partir de PojoBuilder 4.3, vous pouvez annoter un type d'enregistrement Java 17 :
@ GeneratePojoBuilder
public record MyRecord ( int x , int y , String blah ) {}
Les éléments suivants de @GeneratePojoBuilder peuvent être utilisés pour configurer la sortie du processus de génération de code.
Fluent*Builder
deviendra FluentContactBuilder
si le nom du pojo est Contact
. Le modèle par défaut est *Builder
.Visibility.PUBLIC
.*.util
deviendra com.example.util
si le package du pojo est com.example
. Le modèle par défaut est *
.Object.class
.Address.java
, Builder.java
et AddressBuilder.java
. La valeur par défaut est Void.class
, ce qui signifie qu'aucune interface ne doit être implémentée.Recipient.java
, Builder.java
et RecipientBuilder.java
. La valeur par défaut est false
.InputSourceFactory.java
et InputSourceBuilder.java
. La valeur par défaut est *
.CalendarFactory.java
et GregorianCalendarBuilder.java
. La valeur par défaut est le tableau vide.Player.java
, PlayerBuilder.java
et AbstractPlayerBuilder.java
. La valeur par défaut est false
.TextEmail.java
et TextEmailBuilder.java
. La valeur par défaut est false
.com.google.common.base.Optional
et java.util.Optional
de Google Guava introduits avec Java 8. La valeur par défaut est Void.class
, ce qui signifie qu'aucune méthode de définition facultative n'est générée.with*
.validate
ayant un paramètre compatible avec le type du pojo. Si la validation échoue, la méthode doit lever une exception d'exécution (ou l'une de ses sous-classes). Pour un exemple, veuillez consulter Credentials.java
, CredentialsValidator.java
et CredentialsBuilder.java
.Task.java
et TaskBuilder.java
. La valeur par défaut est ""
ce qui signifie ne pas générer cette méthode.À partir de la version 3, PojoBuilder prend en charge les méta-annotations . Autrement dit, vous pouvez placer @GeneratePojoBuilder sur une autre annotation et elle sera héritée.
Les avantages sont :
L'exemple suivant définit @AppPojo
qui peut être appliqué au niveau de la classe et encapsule les annotations de trois sources différentes (PojoBuilder, Lombok et JSR-305).
@ 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 {
}
Celui-ci peut être placé sur chacun de vos pojos :
@ AppPojo
public class Contact {
public String name ;
}
PojoBuilder générera FluentContactBuilder
sur la base des directives héritées de l'annotation @AppPojo
.
Les valeurs par défaut héritées des méta-annotations peuvent être remplacées par des annotations @GeneratePojoBuilder
plus « locales » :
@ AppPojo
@ GeneratePojoBuilder ( intoPackage = "builder" )
public class Contact {
public String name ;
}
Cela générera FluentContactBuilder
comme avant mais dans le builder
de packages.
Le wiki PojoBuilder fournit un livre de recettes sur l'utilisation du générateur PojoBuilder, par exemple pour créer un langage spécifique à un domaine pour les tests automatisés.
Pour des exemples de code complets, veuillez consulter le dossier src/testdata/java/samples.
Pour exécuter le processeur d'annotation PojoBuilder, il vous suffit de le placer dans le chemin de classe au moment de la compilation. Pendant l'exécution, aucune bibliothèque n'est requise puisque la politique de rétention des annotations de PojoBuilder est CLASS
.
Voici une liste de brèves descriptions sur la façon d'exécuter PojoBuilder avec
Le compilateur javac
détectera automatiquement la présence de PojoBuilder si pojobuilder-*.jar
est inclus dans le chemin de classe.
Par exemple:
javac -cp pojobuilder-4.3.0-jar-with-dependencies.jar Contact.java
générera un ContactBuilder
si Contact
est annoté avec @GeneratePojoBuilder
.
Pour plus d'informations, consultez la documentation javac.
Ajoutez ce qui suit au pom.xml
de votre projet pour configurer le processeur d'annotation PojoBuilder.
net.karneim
pojobuilder
4.3.0
provided
Remarques :
${project.build.directory}/generated-sources/annotations
.target
, configurez le generatedSourcesDirectory
du maven-compiler-plugin
. Voir l'exemple de pom Maven pour un exemple.Il s'agit d'un petit script de construction qui montre comment exécuter le processeur d'annotation PojoBuilder avec Gradle.
apply plugin : ' java '
repositories {
mavenCentral()
}
dependencies {
compile ' net.karneim:pojobuilder:4.3.0 '
}
Veuillez noter que cela ajoute non seulement le PojoBuilder et ses dépendances à votre chemin de classe au moment de la compilation, mais également à votre chemin de classe au moment de l'exécution.
Vous pouvez également utiliser le script suivant pour ajouter PojoBuilder uniquement au chemin de classe au moment de la compilation :
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
Dans les deux cas, les sources générées seront placées dans le répertoire standard build/classes
.
Si vous souhaitez les placer ailleurs, précisez simplement la destination comme ceci :
compileJava . options . compilerArgs + = [ ' -s ' , ' src/generated/java ' ]
Le wiki contient un script Gradle étendu qui fait complètement la distinction entre les tâches de génération de code et de compilation.
Il existe un autre script Gradle qui active PojoBuilder pour Eclipse IDE.
Avec Gradle 5.0, aucun processeur d'annotation dans le chemin de classe n'est plus exécuté. Pour que pojobuilder fonctionne à nouveau, remplacez la portée de dépendance utilisée par annotationProcessor
dependencies {
annotationProcessor ' net.karneim:pojobuilder:4.3.0 '
}
Voici un extrait de code d'un exemple de script de construction ANT qui exécute le processeur d'annotation PojoBuilder dans la tâche javac
.
< 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 >
Vous pouvez également configurer Eclipse pour exécuter le processeur d'annotation PojoBuilder pendant le cycle de construction. Il sera invoqué chaque fois que vous enregistrerez des fichiers contenant des sources annotées avec @GeneratePojoBuilder
.
Procédez comme suit pour activer PojoBuilder pour votre projet Eclipse :
pojobuilder-4.3.0-annotations.jar
au chemin de classe de votre projetpojobuiler-4.3.0-jar-with-dependencies.jar
Si vous souhaitez compiler vous-même les sources de ce projet, vous pouvez utiliser Gradle (voir build.gradle).