我有以下结构:
@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) { ... }
}
这是
EntityService
接口(interface)声明: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);
}
不幸的是,尽管没有显示任何错误,但装饰器保存方法在应有的时候没有被调用……我使它起作用的唯一方法是这样的:
@Decorator
public abstract class MyDecorator<T extends BaseEntity> implements EntityService<T> { ... }
没有
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>
有什么线索吗?
最佳答案
设法解决了问题。我的问题是,我在大多数端点/服务实现中直接使用了QueryParams
,例如:public class PersonService extends EntityService<Person, QueryParams> { ... }
实际上,QueryParams
实际上不是extends QueryParams
,它是类本身!这就是PersonService
根本不触发MyDecorator
的原因!
因此,我创建了一个名为IQueryParams
的接口(interface),并改为使用该接口(interface),如下所示:public abstract class MyDecorator<T extends BaseEntity, Q extends IQueryParams> implements EntityService<T, Q> {
现在PersonService
保存方法确实触发了MyDecorator
。