Simplemente quiero tener mi propia anotación para limpiar la masa de anotaciones y poder cambiarlas fácilmente cuando quiera;
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; }Ojala pudiera
class Foo(){ @MyColumn(name="bar_") String bar; @MyColumn String bas; @MyColumn(unique=true) String baq; } nullable = false, length = 32 son los parámetros predeterminados.
Las soluciones Java o Kotlin son bienvenidas.
Dado que está utilizando anotaciones de terceros importadas de javax la mejor opción es introducir una anotación compuesta. (Kotlin no admite la herencia de anotaciones.
@Column(name = "bar_", nullable = false, length = 32) @Size(min = 32, max = 32) annotation class AnnoSpring Boot está haciendo un trabajo bastante bueno al combinar toneladas de anotaciones de configuración todas juntas: échale un vistazo .
Hay un problema con la anotación compuesta Anno , aunque. Debe proporcionar parámetros de anotación con valores constantes.
Si está seguro, necesita una anotación parametrizada como
@Column(...) @Size(min = Anno.max, max = Anno.min) annotation class Anno(val min: Int, val max: Int)eche un vistazo a los complementos Kapt o Kotlin Compiler, necesitará una pieza de generación de código.
Con el complemento del compilador Kapt o Kotlin, solo necesitará anular un método newField de su ClassBuilder personalizado:
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 }Y luego registrarlo con
class AnnoRegister : ComponentRegistrar { override fun registerProjectComponents( project: MockProject, configuration: CompilerConfiguration ) { ... } Debería ser relativamente fácil integrar este procesamiento en un proyecto gradle o maven existente, o simplemente pasar a kotlinc .
Para el tamaño que podrías usar
@Size(min = 32, max = 32) @Inherited annotation class DefaultSize() Sin embargo, tener parámetros dinámicos para el super, como el name en @Column , complica un poco las cosas. Creo que necesita algún tipo de modificaciones de anotación en tiempo de ejecución para eso, consulte Cambio de parámetros de anotación en tiempo de ejecución