Compilers for Avro IDL and Avro Specific Java API - provides code generation tools for converting Avro schemas and IDL definitions into Java classes
—
Comprehensive configuration options for controlling code generation behavior, including field visibility, annotations, template customization, and logical type support.
Control the visibility and access pattern of generated class fields.
/**
* Field visibility options for generated classes
*/
public enum FieldVisibility {
/** Generate public fields */
PUBLIC,
/** Generate private fields */
PRIVATE
}
/** Set field visibility (PUBLIC or PRIVATE) */
public void setFieldVisibility(FieldVisibility fieldVisibility);
/** Check if fields should be public */
public boolean publicFields();
/** Check if fields should be private */
public boolean privateFields();Control generation of accessor methods for class fields.
/** Check if setters should be created */
public boolean isCreateSetters();
/** Enable/disable setter creation */
public void setCreateSetters(boolean createSetters);
/** Check if optional getters should be created */
public boolean isCreateOptionalGetters();
/** Enable/disable optional getters */
public void setCreateOptionalGetters(boolean createOptionalGetters);
/** Check if getters return Optional */
public boolean isGettersReturnOptional();
/** Configure Optional return types for getters */
public void setGettersReturnOptional(boolean gettersReturnOptional);
/** Check if optional getters are only for nullable fields */
public boolean isOptionalGettersForNullableFieldsOnly();
/** Configure optional getters scope to nullable fields only */
public void setOptionalGettersForNullableFieldsOnly(boolean optionalGettersForNullableFieldsOnly);Control constructor generation patterns.
/** Check if all-args constructor should be created */
public boolean isCreateAllArgsConstructor();Control generation of annotations for null safety and validation.
/** Check if null-safe annotations should be created */
public boolean isCreateNullSafeAnnotations();
/** Enable/disable null-safe annotations */
public void setCreateNullSafeAnnotations(boolean createNullSafeAnnotations);Customize the code generation templates and output formatting.
/** Set additional Velocity template tools */
public void setAdditionalVelocityTools(List<Object> additionalVelocityTools);
/** Set custom template directory for code generation */
public void setTemplateDir(String templateDir);
/** Set file suffix for generated classes */
public void setSuffix(String suffix);Configure support for Avro logical types and custom conversions.
/** Enable decimal logical type support */
public void setEnableDecimalLogicalType(boolean enableDecimalLogicalType);
/** Add custom logical type conversion class */
public void addCustomConversion(Class<?> conversionClass);
/** Get conversion classes used by schema */
public Collection<String> getUsedConversionClasses(Schema schema);
/** Get custom logical type factories used by schema */
public Map<String, String> getUsedCustomLogicalTypeFactories(Schema schema);Control string representation in generated classes when using Ant tasks.
/** Set string type for generated classes (CharSequence, String, Utf8) */
public void setStringType(GenericData.StringType stringType);
/** Get current string type setting */
public GenericData.StringType getStringType();import org.apache.avro.compiler.specific.SpecificCompiler;
import org.apache.avro.compiler.specific.SpecificCompiler.FieldVisibility;
SpecificCompiler compiler = new SpecificCompiler(schema);
// Configure private fields with accessors
compiler.setFieldVisibility(FieldVisibility.PRIVATE);
compiler.setCreateSetters(true);
compiler.setCreateOptionalGetters(true);
compiler.compileToDestination(schemaFile, outputDir);Generated code:
public class User extends SpecificRecordBase implements SpecificRecord {
private CharSequence name; // Private field
private Integer age; // Private field
// Setter methods
public void setName(CharSequence name) { this.name = name; }
public void setAge(Integer age) { this.age = age; }
// Getter methods
public CharSequence getName() { return name; }
public Integer getAge() { return age; }
// Optional getters
public Optional<CharSequence> getNameOptional() { return Optional.ofNullable(name); }
public Optional<Integer> getAgeOptional() { return Optional.ofNullable(age); }
}SpecificCompiler compiler = new SpecificCompiler(schema);
// Configure getters to return Optional
compiler.setGettersReturnOptional(true);
compiler.setOptionalGettersForNullableFieldsOnly(true);
compiler.compileToDestination(schemaFile, outputDir);Generated code:
// For nullable fields
public Optional<String> getEmail() { return Optional.ofNullable(email); }
// For non-nullable fields (if optionalGettersForNullableFieldsOnly is true)
public String getName() { return name; } // Returns String directlySpecificCompiler compiler = new SpecificCompiler(schema);
// Enable null-safe annotations
compiler.setCreateNullSafeAnnotations(true);
compiler.compileToDestination(schemaFile, outputDir);Generated code:
import javax.annotation.Nullable;
import javax.annotation.Nonnull;
public class User extends SpecificRecordBase {
@Nullable
private CharSequence email;
@Nonnull
private CharSequence name;
public void setEmail(@Nullable CharSequence email) { this.email = email; }
public void setName(@Nonnull CharSequence name) { this.name = name; }
}import org.apache.avro.Conversions;
import org.apache.avro.data.TimeConversions;
SpecificCompiler compiler = new SpecificCompiler(schema);
// Enable decimal logical type
compiler.setEnableDecimalLogicalType(true);
// Add custom conversions
compiler.addCustomConversion(Conversions.DecimalConversion.class);
compiler.addCustomConversion(TimeConversions.DateConversion.class);
compiler.addCustomConversion(TimeConversions.TimeMillisConversion.class);
compiler.addCustomConversion(TimeConversions.TimeMicrosConversion.class);
compiler.addCustomConversion(TimeConversions.TimestampMillisConversion.class);
compiler.addCustomConversion(TimeConversions.TimestampMicrosConversion.class);
compiler.compileToDestination(schemaFile, outputDir);import java.util.*;
SpecificCompiler compiler = new SpecificCompiler(schema);
// Set custom template directory
compiler.setTemplateDir("/path/to/custom/templates");
// Add custom Velocity tools
List<Object> velocityTools = new ArrayList<>();
velocityTools.add(new CustomStringUtil());
velocityTools.add(new CustomDateUtil());
compiler.setAdditionalVelocityTools(velocityTools);
// Custom file suffix
compiler.setSuffix(".generated.java");
compiler.compileToDestination(schemaFile, outputDir);import org.apache.avro.Schema;
import org.apache.avro.compiler.specific.SpecificCompiler;
import org.apache.avro.compiler.specific.SpecificCompiler.FieldVisibility;
import org.apache.avro.Conversions;
import java.util.*;
Schema schema = new Schema.Parser().parse(new File("user.avsc"));
SpecificCompiler compiler = new SpecificCompiler(schema);
// Field visibility and accessors
compiler.setFieldVisibility(FieldVisibility.PRIVATE);
compiler.setCreateSetters(true);
compiler.setCreateOptionalGetters(true);
compiler.setGettersReturnOptional(false); // Optional getters separate from regular getters
compiler.setOptionalGettersForNullableFieldsOnly(true);
// Annotations
compiler.setCreateNullSafeAnnotations(true);
// Logical types
compiler.setEnableDecimalLogicalType(true);
compiler.addCustomConversion(Conversions.DecimalConversion.class);
// Template customization
compiler.setSuffix(".java");
List<Object> tools = Arrays.asList(new CustomUtilityTool());
compiler.setAdditionalVelocityTools(tools);
compiler.compileToDestination(new File("user.avsc"), new File("src/main/java"));<!-- Configure string type in Ant task -->
<schema destdir="src/main/java" stringType="String">
<fileset dir="src/main/avro">
<include name="**/*.avsc"/>
</fileset>
</schema>
<!-- All SpecificCompiler configuration options can be set as task attributes -->
<!-- Note: Most advanced options require direct SpecificCompiler usage -->| Configuration | Generated Code | Access Pattern |
|---|---|---|
PUBLIC | public CharSequence name; | Direct field access |
PRIVATE + setCreateSetters(true) | private CharSequence name; + setters/getters | Method access only |
| Configuration | Nullable Field | Non-nullable Field |
|---|---|---|
setCreateOptionalGetters(true) | Optional<T> getFieldOptional() | Optional<T> getFieldOptional() |
setOptionalGettersForNullableFieldsOnly(true) | Optional<T> getFieldOptional() | No optional getter |
| StringType | Generated Field Type | Usage |
|---|---|---|
CharSequence (default) | CharSequence | Generic string interface |
String | String | Concrete string class |
Utf8 | Utf8 | Avro's optimized string type |
Install with Tessl CLI
npx tessl i tessl/maven-org-apache-avro--avro-compiler