Java CDI:具有多个通用参数的装饰器

Mar*_*hel 14 java generics decorator cdi

我有以下结构:

@Decorator
public abstract class MyDecorator<T extends BaseEntity, Q extends QueryParams> implements EntityService<T, Q> {

    @Any
    @Inject
    @Delegate
    EntityService<T, Q> delegate;

    @Override
    public T save(T entity) { ... }

} 
Run Code Online (Sandbox Code Playgroud)

这是EntityService接口声明:

public interface EntityService<T extends BaseEntity, Q extends QueryParams> {

    T save(T entity);

    void deleteById(Integer id);

    void deleteAllById(List<Integer> ids);

    void delete(T entity);

    void deleteAll(List<T> entities);

    T findById(Integer id);

    QueryResultWrapper<T> query(Q parameters);

    Long count(Q parameters);

}
Run Code Online (Sandbox Code Playgroud)

不幸的是,装饰器保存方法永远不会被调用,虽然没有显示错误...我得到它的唯一方法是这样:

@Decorator
public abstract class MyDecorator<T extends BaseEntity> implements EntityService<T> { ... }
Run Code Online (Sandbox Code Playgroud)

没有Q extends QueryParams通用的参数.

在MyDecorator里面宣布beans.xml.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
   bean-discovery-mode="all" version="1.1">

    <decorators>
        <class>fortuna.backend.comum.decorators.MyDecorator</class>
    </decorators>

</beans>
Run Code Online (Sandbox Code Playgroud)

有线索吗?

Mar*_*hel 1

设法解决了问题。我的问题是我QueryParams直接在大多数端点/服务实现中使用,例如:

public class PersonService extends EntityService<Person, QueryParams> { ... }

事实上,其实QueryParams不是extends QueryParams,它是类本身!这就是为什么根本PersonService没有触发!MyDecorator

因此,我创建了一个名为IQueryParams并使用它的接口,如下所示:

public abstract class MyDecorator<T extends BaseEntity, Q extends IQueryParams> implements EntityService<T, Q> {

现在PersonServicesave 方法确实触发了MyDecorator.