An annotation driven field name and path generator.
It generates field names of a POJO as constants. Fieldr is also capable of generating field name paths derived from class graphs.
Whenever you want to access resources for which the name or the path of a POJOs' (or entitys') field name is required, having those names generated as code is really helpful and much less error-prone as if you would copy it manually.
Fieldr is meant to be a pragmatic helper especially useful for raw mongodb queries.
Simply annotate your POJOs with @GenerateFieldNames and let the annotation processor do the rest for you.
Imagine you have a class Facility annotated with @GenerateFieldNames:
@GenerateFieldNames
public class Facility extends Parent {
private String id;
private String owner;
private String name;
}
then fieldr will generate a class Facility_ where you can access the fieldnames from:
@Test
public void testSimpleFieldNames() {
assertEquals("id", Facility_.id);
assertEquals("owner", Facility_.owner);
assertEquals("name", Facility_.name);
}
Imagine you have a ContactPerson linked from Facility and ContactPersion is linked to a Location:
@GenerateFieldNames
public class Facility extends Parent {
...
private ContactPersion contactPerson;
}
@GenerateFieldNames
public class ContactPerson {
private String name;
private String email;
private Location userLocation;
}
Then fieldr generates the field name paths derived from the class graph from you:
@Test
public void testFieldsPath() {
assertEquals("contactPerson.email", Facility_.contactPerson.email);
assertEquals("contactPerson.userLocation", Facility_.contactPerson.userLocation);
assertEquals("contactPerson.userLocation.city", Facility_.contactPerson.userLocation.city);
}
In Spring Data MongoDB, you can use @Field to define the field name as used in the database.
Now if you want to query stuff, then you must provide the database field name instead of the POJO property name:
@GenerateFieldNames
public class Location {
private String city;
@Field("street_address")
private String street;
}
Fieldr handles this for you:
@Test
public void testMongoDbFields() {
assertEquals("contactPerson.userLocation.city", Facility_.contactPerson.userLocation.city);
assertEquals("contactPerson.userLocation.street_address", Facility_.contactPerson.userLocation.street_address);
}
Fieldr generates field names for all non-static, non-final fields from the current class and its ancestors.
Fieldr is currently only capable of generating superclass fields that are protected!
Add a compile time dependency to your maven pom:
<dependency>
<groupId>com.github.foby</groupId>
<artifactId>fieldr</artifactId>
<version>0.1</version>
<scope>compile</scope>
</dependency>
In the build section configure maven-compiler-plugin:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
Start annotating your POJOs with @GenerateFieldNames and run
mvn clean compile
The generated field name classes should be available under /target/generated-sources/annotations.
Note that you might need to configure your IDE to use this as an additional source folder.
Enable annotation-processing directly in your IDE and add fieldr as an annotation processor.
Fieldr is not an expression language and currently only supports path expressions separated with a . (dot).
Also, fieldr is an early development stage. Contribution very welcome!