Is it possible to have @AliasFor annotation pass the argument to nested annotation? Something like passing value of name() to nested @Queue annotation inside @RabbitListener? I basically wanted to specify multiple queues with same binding parameters to same exchange, and only vary queue name.
1 Answer
I don't think you can do that for nested annotations. You probably need to think about having a custom @Queue annotation extension and then used it inside your @SomeListener. But the problem is that @Queue annotation cannot be extended. It has that @Target({}), so it is not possible at the moment.
If you really wish to have such a customization, consider to fix Spring AMQP on the matter via @Target(ANNOTATION_TYPE) and add some tests to demonstrate the feature and contribute it back to the framework.
Unfortunately I don't see the other way to support your request, unless you would go the to declare Queue beans and use just their names in that your custom annotation:
@Retention(RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@RabbitListener
public @interface MyListener {
@AliasFor(annotation = RabbitListener.class, attribute = "queues")
String[] queues() default {};
}
3 Comments
MergedAnnotations before we synthesize the new annotation - e.g. copy the value of a top level attribute into the nested attribute - something like return MergedAnnotations.of(SomeListener.class, updateAttributes(merged.asMap())). I will experiment.