Turning one annotation into many annotations with AspectJ

£可爱£侵袭症+ 提交于 2019-12-09 10:58:35

问题


I have discovered a pattern in my JPA mappings that I would like to codify. A simple example follows:

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

I would like to create a single annotation called SortedOneToMany that I can apply to the above set:

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

I have written the following aspect to "attach" the JPA annotations whenever it sees my annotation:

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

But I don't know how can I access the values of the SortedOneToMany annotation parameters and use them when defining the OneToMany and Sort annotations. There may be cases where I want to change one of the default values like so:

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

So how can I pass the annotation values from SortedOneToMany to the Sort annotation?


回答1:


I received this answer from Andy Clement on the aspectj-users mailing list:

Hi,

I'm afraid you can't do that with AspectJ right now, you can't pass a piece of the matched information to the new annotation. I can perhaps imagine some hypothetical syntax:

declare @field: @SortedOneToMany(sort=SortType.COMPARATOR,comparator={1}) * * : @Sort(type=SortType.COMPARATOR,comparator={1});

which would seem to achieve what you want.

Maybe raise an enhancement request for it: https://bugs.eclipse.org/bugs/enter_bug.cgi?product=AspectJ

sorry I don't have better news.

cheers Andy

I created a ticket for the issue in case anyone wants to follow the progress: https://bugs.eclipse.org/bugs/show_bug.cgi?id=345515



来源:https://stackoverflow.com/questions/5901690/turning-one-annotation-into-many-annotations-with-aspectj

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!