A transformer of headers used in
Nested
attributes. Used to reassign header names/indexes of
attributes of a
Nested
class which is useful when multiple
Nested
attributes of the same type are
used within a class. For example, consider the
Wheel
class defined as:
public class Wheel {
@Parsed
String brand;
@Parsed
int miles;
}
And a
Car
which has four
Wheels
:
public static class Car {
@Nested
Wheel frontLeft;
@Nested
Wheel frontRight;
@Nested
Wheel rearLeft;
@Nested
Wheel rearRight;
}
The
HeaderTransformer
allows us to "rename" the attributes of each different
Wheel
of the
Car
so that input columns can be assigned to the appropriate places.
Assuming an input with headers
frontLeftWheelBrand,frontLeftWheelMiles,frontRightWheelBrand,frontRightWheelMiles,rearLeftWheelBrand,rearLeftWheelMiles,rearRightWheelBrand,rearRightWheelMiles
,
a
HeaderTransformer
can be created like this to assign a prefix in front of the header names derived from
Wheel
(originally just "brand" and "miles"):
public static class PrefixTransformer extends HeaderTransformer {
private String prefix;
public PrefixTransformer(String... args) {
prefix = args[0];
}
@Override
public String transformName(Field field, String name) {
return prefix + Character.toUpperCase(name.charAt(0)) + name.substring(1);
}
}
This allows us to to define the
Car
class as:
public static class Car {
@Nested(headerTransformer = PrefixTransformer.class, args = "frontLeftWheel")
Wheel frontLeft;
@Nested(headerTransformer = PrefixTransformer.class, args = "frontRightWheel")
Wheel frontRight;
@Nested(headerTransformer = PrefixTransformer.class, args = "rearLeftWheel")
Wheel rearLeft;
@Nested(headerTransformer = PrefixTransformer.class, args = "rearRightWheel")
Wheel rearRight;
}
The above annotation will prefix the
frontLeft
fields ("brand" and "miles") with "frontLeftWheel", effectively
forming the header "frontLeftWheelBrand" and "frontLeftWheelMiles", which will match the input headers and assign the
correct values to the correct
Wheel
instance.
IMPORTANT It is mandatory to define a constructor that takes
String[]
as a parameter. The actual
parameter values come from
Nested.args()
to allow custom configuration of the concrete
HeaderTransformer
instance.