#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