I simply want to have my own annotation to clean up the annotation mass and to be able to change them easily when I want;
import javax.persistence.Column
import javax.validation.constraints.Size
class Foo(){
@Column(name="bar_", nullable = false, length = 32)
@Size(min = 32, max = 32)
String bar;
@Column(nullable = false, length = 32)
@Size(min = 32, max = 32)
String bas;
@Column(nullable = false, length = 32, unique=true)
@Size(min = 32, max = 32)
String baq;
}
Wish I could
class Foo(){
@MyColumn(name="bar_")
String bar;
@MyColumn
String bas;
@MyColumn(unique=true)
String baq;
}
nullable = false, length = 32
are the default params.
Java or Kotlin solutions are welcome.
To create your own Java Annotation you must use @interface Annotation_name, this will create a new Java Annotation for you. The @interface will describe the new annotation type declaration. After giving a name to your Annotation, you will need to create a block of statements inside which you may declare some variables.
wrap(int[] array, int offset, int length) The wrap() method wraps an int array into a buffer. The new buffer will be backed by the given int array; that is, modifications to the buffer will cause the array to be modified and vice versa. The new buffer's capacity will be array.
Since you're using 3-rd party annotations imported from javax
the best option is to introduce a composite annotation. (Kotlin doesn't support annotation inheritance.
@Column(name = "bar_", nullable = false, length = 32)
@Size(min = 32, max = 32)
annotation class Anno
Spring boot is doing a pretty good job combining tons of config annotations all together - check it out.
There is a problem with composite annotation Anno
, tho. You have to supply annotation parameters with constant values.
If you're sure, you need a parametrised annotation like
@Column(...)
@Size(min = Anno.max, max = Anno.min)
annotation class Anno(val min: Int, val max: Int)
have a look at Kapt or Kotlin Compiler plugins, you will need a piece of code generation.
With Kapt or Kotlin compiler plugin you will need just to override a newField
method of your custom ClassBuilder
:
override fun newField(
origin: JvmDeclarationOrigin,
access: Int,
name: String,
desc: String,
signature: String?,
value: Any?
): FieldVisitor {
// if field is annotated with Anno -- add two custom annotation with parameters of your choice
// otherwise perform a standard field init
}
And then register it with
class AnnoRegister : ComponentRegistrar {
override fun registerProjectComponents(
project: MockProject,
configuration: CompilerConfiguration
) {
...
}
It should be relatively easy to integrate this processing into an existing gradle or maven project, or just pass to kotlinc
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With