使用 AspectJ 将一个注释变成多个注释

发布于 2024-11-05 10:52:16 字数 945 浏览 0 评论 0原文

我在 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 和 Sort 注释时使用它们吗?在某些情况下,我可能想更改默认值之一,如下所示:

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

那么如何将注释值从 SortedOneToMany 传递到 Sort 注释?

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?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

蝶…霜飞 2024-11-12 10:52:16

我在aspectj-users 邮件列表上收到了 Andy Clement 的回答:

嗨,

恐怕你现在不能用 AspectJ 做到这一点,你不能通过
新注释的匹配信息。我也许可以
想象一些假设的语法:

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

这似乎可以实现你想要的。

也许可以提出增强请求:
https://bugs.eclipse.org/bugs/enter_bug.cgi?product=AspectJ

抱歉,我没有更好的消息。

干杯
安迪

我为该问题创建了一张票,以防有人想要跟踪进度:https: //bugs.eclipse.org/bugs/show_bug.cgi?id=345515

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文