Автор: Майкл Карнейм
Домашняя страница проекта: http://github.com/mkarneim/pojobuilder.
Генератор PojoBuilder — это процессор аннотаций, совместимый с Java 6, который генерирует свободный класс компоновщика для POJO (обычный старый Java-объект).
Сгенерированный конструктор предоставляет
Вот пример того, как вы можете использовать сгенерированный построитель Pojo из вашего кода:
Contact james = new ContactBuilder ()
. withSurname ( "Bond" )
. withFirstname ( "James" )
. withEmail ( "[email protected]" )
. build ();
Построители весьма полезны, например, для создания тестовых данных, когда вам нужно только установить соответствующие свойства данных.
Для получения дополнительной информации о
Исходный код, расположенный в каталоге «src», находится в ПУБЛИЧНОМ ДОМЕНЕ. Для получения дополнительной информации, пожалуйста, прочтите файл COPYING.
PojoBuilder — это генератор чистого кода. Он не добавляет никаких зависимостей времени выполнения в ваш проект.
Однако PojoBuilder добавляет в ваш проект следующую зависимость времени компиляции , которая имеет собственную лицензию:
PojoBuilder имеет открытый исходный код. Исходный код доступен по адресу http://github.com/mkarneim/pojobuilder. Более старые версии и журнал изменений см. на странице истории выпусков.
Двоичные файлы PojoBuilder доступны для загрузки в репозитории Sonatype OSS Maven и Maven Central.
Если вы не используете какой-либо инструмент автоматизации сборки, поддерживающий репозитории Maven, вы можете загрузить pojobuilder-4.3.0-jar-with-dependencies.jar
, чтобы получить PojoBuilder в комплекте со всеми зависимыми библиотеками.
Генератор PojoBuilder использует процессор аннотаций для создания построителей pojo. У вас есть следующие варианты запуска генерации кода:
Чтобы создать класс-построитель для pojo, вы можете аннотировать один из его конструкторов с помощью @GeneratePojoBuilder
.
Давайте посмотрим на следующий пример pojo:
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 ;
}
}
Аннотация @GeneratePojoBuilder сообщает обработчику аннотаций создать новый исходный файл Java с именем ContactBuilder
. Посмотрите ContactBuilder.java
чтобы увидеть сгенерированный исходный код.
Обратите внимание, что конструктор должен быть общедоступным или иным образом доступным для сгенерированного компоновщика, например, если он защищен, сгенерированный компоновщик должен находиться в том же пакете.
А также обратите внимание, что имена параметров конструктора должны точно совпадать с именами свойств pojo.
Необязательная аннотация @ConstructorProperties может использоваться для указания сопоставления имен параметров-конструктора с соответствующими именами свойств bean-компонента в pojo, если они различаются.
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 ;
}
}
Если у вашего pojo нет конструктора (или общедоступного конструктора по умолчанию), вы можете аннотировать его класс с помощью @GeneratePojoBuilder
.
Давайте посмотрим на следующий пример pojo:
@ 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 ;
}
}
Посмотрите UserBuilder.java
чтобы увидеть сгенерированный исходный код.
В качестве альтернативы, если у вас нет доступа к исходному коду Pojo или вы не любите аннотировать Pojo, вы можете аннотировать фабричный метод:
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 );
}
}
Посмотрите UrlBuilder.java
чтобы увидеть сгенерированный исходный код.
Обратите внимание, что фабричный метод должен быть общедоступным и статическим . Имена параметров метода должны точно соответствовать именам свойств pojo.
Необязательная аннотация @FactoryProperties может использоваться для указания сопоставления имен параметров фабричного метода с соответствующими именами свойств bean-компонента в pojo, если они различаются.
public class FileFactory {
@ GeneratePojoBuilder ( intoPackage = "samples" )
@ FactoryProperties ({ "path" })
public static File createFile ( String arg1 ) {
return new File ( arg1 );
}
}
Посмотрите FileBuilder.java
чтобы увидеть сгенерированный исходный код.
Начиная с PojoBuilder 4.3, вы можете аннотировать тип записи Java 17:
@ GeneratePojoBuilder
public record MyRecord ( int x , int y , String blah ) {}
Следующие элементы @GeneratePojoBuilder можно использовать для настройки результатов процесса генерации кода.
Fluent*Builder
станет FluentContactBuilder
если имя pojo — Contact
. Шаблон по умолчанию — *Builder
.Visibility.PUBLIC
.*.util
станет com.example.util
, если пакет pojo — com.example
. Шаблон по умолчанию — *
.Object.class
.Address.java
, Builder.java
и AddressBuilder.java
. По умолчанию используется Void.class
, что означает, что интерфейс не должен быть реализован.Recipient.java
, Builder.java
и RecipientBuilder.java
. По умолчанию — false
.InputSourceFactory.java
и InputSourceBuilder.java
. По умолчанию — *
.CalendarFactory.java
и GregorianCalendarBuilder.java
. По умолчанию — пустой массив.Player.java
, PlayerBuilder.java
и AbstractPlayerBuilder.java
. По умолчанию — false
.TextEmail.java
и TextEmailBuilder.java
. По умолчанию — false
.com.google.common.base.Optional
и java.util.Optional
Google Guava, представленные в Java 8. По умолчанию используется Void.class
, что означает, что никакие необязательные методы установки не генерируются.with*
.validate
, имеющий один параметр, совместимый с типом pojo. Если проверка не удалась, метод должен выдать какое-то исключение времени выполнения (или один из его подклассов). Пример см. в Credentials.java
, CredentialsValidator.java
и CredentialsBuilder.java
.Task.java
и TaskBuilder.java
. По умолчанию установлено значение ""
, что означает не генерировать этот метод.Начиная с версии 3, PojoBuilder поддерживает метааннотации . То есть вы можете поместить @GeneratePojoBuilder в другую аннотацию, и она будет унаследована.
Преимущества:
В следующем примере определяется @AppPojo
, который может применяться на уровне класса и инкапсулирует аннотации из трех разных источников (PojoBuilder, Lombok и 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 {
}
Это можно разместить на каждом из ваших pojo:
@ AppPojo
public class Contact {
public String name ;
}
PojoBuilder сгенерирует FluentContactBuilder
на основе директив, унаследованных из аннотации @AppPojo
.
Значения по умолчанию, унаследованные от метааннотаций, могут быть переопределены более «локальными» аннотациями @GeneratePojoBuilder
:
@ AppPojo
@ GeneratePojoBuilder ( intoPackage = "builder" )
public class Contact {
public String name ;
}
Это создаст FluentContactBuilder
, как и раньше, но в builder
пакетов.
Вики-сайт PojoBuilder предоставляет кулинарную книгу по использованию генератора PojoBuilder, например, для создания предметно-ориентированного языка для автоматических тестов.
Некоторые полные примеры кода можно найти в папке src/testdata/java/samples.
Чтобы выполнить обработчик аннотаций PojoBuilder, вам просто нужно поместить его в путь к классам во время компиляции. Во время выполнения никакие библиотеки не требуются, поскольку политика хранения аннотаций PojoBuilder — CLASS
.
Вот список кратких описаний того, как запустить PojoBuilder с помощью
Компилятор javac
автоматически обнаружит наличие PojoBuilder, если pojobuilder-*.jar
включен в путь к классам.
Например:
javac -cp pojobuilder-4.3.0-jar-with-dependencies.jar Contact.java
сгенерирует ContactBuilder
, если Contact
помечен @GeneratePojoBuilder
.
Для получения дополнительной информации см. документацию javac.
Добавьте следующее в pom.xml
вашего проекта, чтобы настроить обработчик аннотаций PojoBuilder.
net.karneim
pojobuilder
4.3.0
provided
Примечания:
${project.build.directory}/generated-sources/annotations
.target
каталога, настройте generatedSourcesDirectory
плагина maven-compiler-plugin
. Пример см. в образце Maven pom.Это небольшой сценарий сборки, показывающий, как запустить обработчик аннотаций PojoBuilder с помощью Gradle.
apply plugin : ' java '
repositories {
mavenCentral()
}
dependencies {
compile ' net.karneim:pojobuilder:4.3.0 '
}
Обратите внимание, что при этом PojoBuilder и его зависимости добавляются не только в путь к классам во время компиляции, но и в путь к классам во время выполнения.
Альтернативно вы можете использовать следующий скрипт, чтобы добавить PojoBuilder только в путь к классам времени компиляции:
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
В обоих случаях сгенерированные исходники будут помещены в стандартный каталог build/classes
.
Если вы хотите поместить их в другое место, просто укажите место назначения следующим образом:
compileJava . options . compilerArgs + = [ ' -s ' , ' src/generated/java ' ]
Вики содержит расширенный скрипт Gradle, который полностью различает задачи генерации кода и компиляции.
Существует еще один сценарий Gradle, который включает PojoBuilder для Eclipse IDE.
В Gradle 5.0 любой обработчик аннотаций в пути к классам больше не выполняется. Чтобы pojobuilder снова заработал, замените используемую область зависимости на annotationProcessor
dependencies {
annotationProcessor ' net.karneim:pojobuilder:4.3.0 '
}
Ниже приведен фрагмент кода примера сценария сборки ANT, который запускает обработчик аннотаций PojoBuilder в задаче 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 >
Вы также можете настроить Eclipse для запуска обработчика аннотаций PojoBuilder во время цикла сборки. Он будет вызываться всякий раз, когда вы сохраняете файлы, содержащие источники, помеченные @GeneratePojoBuilder
.
Выполните следующие действия, чтобы включить PojoBuilder для вашего проекта Eclipse:
pojobuilder-4.3.0-annotations.jar
в путь к классам вашего проекта.pojobuiler-4.3.0-jar-with-dependencies.jar
Если вы хотите скомпилировать исходники этого проекта самостоятельно, вы можете использовать Gradle (см. build.gradle).