Превращение одной аннотации во множество аннотаций с помощью AspectJ

#java #annotations #aspectj

#java #аннотации #aspectj

Вопрос:

Я обнаружил шаблон в своих сопоставлениях JPA, который я хотел бы кодифицировать. Ниже приведен простой пример:

 @OneToMany(fetch=FetchType.EAGER)
@Sort(type=SortType.NATURAL)
private SortedSet<Item> items;
  

Я хотел бы создать единую аннотацию под названием SortedOneToMany, которую я мог бы применить к вышеуказанному набору:

 public @interface SortedOneToMany {
    FetchType fetch() default EAGER;
    SortType sort() default NATURAL;
    Class comparator() default void.class;
}
  

Я написал следующий аспект, чтобы «прикреплять» аннотации JPA всякий раз, когда он видит мою аннотацию:

 public aspect SortedOneToManyAspect {
    declare @field: @SortedOneToMany * * : @OneToMany(fetch=FetchType.EAGER);
    declare @field: @SortedOneToMany * * : @Sort(type=SortType.NATURAL);
}
  

Но я не знаю, как я могу получить доступ к значениям параметров аннотации SortedOneToMany и использовать их при определении аннотаций OneToMany и сортировки. Могут быть случаи, когда я хочу изменить одно из значений по умолчанию следующим образом:

 @SortedOneToMany(sort=SortType.COMPARATOR,comparator=ItemComparator.class)
private SortedSet<Item> items;
  

Итак, как я могу передать значения аннотации из SortedOneToMany в аннотацию сортировки?

Ответ №1:

Я получил этот ответ от Энди Клемента из списка рассылки aspectj-users:

Привет,

Я боюсь, что вы не можете сделать это с AspectJ прямо сейчас, вы не можете передать часть сопоставленной информации в новую аннотацию. Возможно, я могу представить некоторый гипотетический синтаксис:

объявите @field: @SortedOneToMany(сортировка=SortType.COMPARATOR,comparator={1}) * * : @Sort(тип=SortType.КОМПАРАТОР,comparator={1});

казалось бы, это позволяет достичь того, чего вы хотите.

Возможно, подайте запрос на улучшение для этого: https://bugs.eclipse.org/bugs/enter_bug.cgi?product=AspectJ

извините, у меня нет лучших новостей.

приветствую Энди

Я создал заявку на проблему на случай, если кто-нибудь захочет следить за прогрессом: https://bugs.eclipse.org/bugs/show_bug.cgi?id=345515