【问题标题】:The annotation "@Added" is disallowed for this location, when using custom annotation with events in CDI在 CDI 中使用带有事件的自定义注释时,此位置不允许使用注释“@Added”
【发布时间】:2026-01-21 00:40:01
【问题描述】:

在 @Observes 限定符附近使用自定义限定符来捕获事件时,出现此编译错误。

所有类都在同一个包中,所以问题不在于导入语句。我已经检查过了。

@Inject
private Logger logger;
List<Book> inventory = new ArrayList<>();

public void addBook(@Observes @Added Book book) {
    logger.warning("adding book" + book.getTitle());
    inventory.add(book);
}

public void removeBook(@Observes @Removed Book book) {
    logger.warning("remove book");
}

所以,这一行: public void addBook(@Observes @Added Book book) {

像这样:public void removeBook(@Observes @Removed Book book) {

标记有以下错误:注释@Added (@Removed) 不允许用于此位置。

这里是定义方法 addBook 和 removeBook 的代码。这里没有问题。

@Inject
@Added
private Event<Book> bookAddedEvent;

@Inject
@Removed
private Event<Book> bookRemovedEvent;

public Book createBook(String title, float price, String description) {
    Book book = new Book(title, price, description);
    book.setNumber(numberGenerator.generateNumber());

    bookAddedEvent.fire(book);
    return book;
}

public void deleteBook(Book book) {
    bookRemovedEvent.fire(book);
}

【问题讨论】:

    标签: java events cdi


    【解决方案1】:

    您的限定符注释@Added@Removed 的定义是什么?

    您可能在@Target 列表中缺少PARAMETER 条目:

    @Target({ TYPE, METHOD, PARAMETER, FIELD })
    

    【讨论】:

    • 伙计……你是最伟大的!谢谢。我只有@Target({ TYPE, FIELD, METHOD })