Я пытаюсь дать совет относительно метода, расширяющего интерфейс, который выглядит следующим образом:
public interface StructureService {
void delete(FileEntry entry);
}
public interface FileService extends StructureService {
void dummy();
}
Классы, которые их реализуют, выглядят следующим образом:
public class DbStructureService implements StructureService {
public void delete(FileEntry entry) {
}
}
public class DbFileService extends DbStructureService implements FileService {
public void dummy() {
}
}
Я пытаюсь сопоставить метод удаления, но только для классов, реализующих FileService.
Я определил следующий аспект:
public aspect FileServiceEventDispatcherAspect {
pointcut isFileService() : within(org.service.FileService+);
pointcut delete(FileEntry entry) :
execution(void org.service.StructureService.delete(..))
&& args(entry) && isFileService();
void around(FileEntry entry) : delete(entry) {
proceed(entry);
}
}
Проблема в том, что, пока у меня включен pointcut isFileService, он не будет соответствовать ни одному классу; хотя есть много методов, которые должны соответствовать этому
Если я заменю within(org.service.FileService+)
на within(org.service.StructureService+)
, он также будет работать нормально.
Я пытался поэкспериментировать с этим () и так далее, но безуспешно. Как мне сделать это в aspectj?
EDIT:
Обновлено, как выглядят классы, реализующие интерфейсы. Я думаю, что этот сценарий может быть трудно советовать, так как в DbFileService нет переопределенного метода