Наследование репозитория JPA - расширение нескольких интерфейсов - PullRequest
0 голосов
/ 13 января 2019

Мои репозитории JPA расширяют пользовательский интерфейс, который содержит аннотации для обработки авторизации общим способом.

public interface MultiTenantCrudRepo<T, ID> extends CrudRepository<T, ID>

Этот интерфейс добавляет аннотации @PreAuthorize, @PostAuthorize, @PreFilter и @PostFilter к методам CrudRepository.

Кроме того, для некоторых объектов мне необходимо реализовать мягкое удаление. Для этой цели я создал «SoftDeleteRepository», например:

public interface SoftDeleteRepository<T extends BaseEntity<I> & SoftDeletable, I extends Serializable> extends CrudRepository<T, I> {

    @Query("update #{#entityName} e set e.isDeleted = true where e.id = ?#{#entity.id}")
    @Modifying
    @Override
    public void delete(@Param("entity") T entity);

Вы можете видеть, что он добавляет аннотации @Query для реализации необходимых мне функций.

Оба интерфейса работают независимо, как и ожидалось, но когда для репозитория требуются оба атрибута (авторизация и мягкое удаление), как это

public interface FooRepo extends SoftDeleteRepository<Foo, Long>, MultiTenantCrudRepo<Foo, Long> {

похоже, что действуют только аннотации первого интерфейса после "extends". Поэтому в этом случае я получаю FooRepo, который поддерживает мягкое отклонение, но без проверки авторизации.

Как лучше всего заставить обоих работать?

1 Ответ

0 голосов
/ 13 января 2019

Угадайте, что это сложно сделать, потому что на самом деле это будет наследование нескольких объектов, которое Java не поддерживает, например, см. this .

Что было бы выбрано, если бы были две одинаковые аннотации с разными параметрами, например?

Многие фреймворки, такие как данные Spring, прекрасно справляются с проверкой наследования аннотаций, но предполагают, только если нет мульти-наследования и / или с одинаковыми аннотациями. Эти структуры могут использовать отражение, чтобы подняться по «дереву реализаций», но могут выбрать только один путь из-за вышеизложенного или, если правильно реализовано, выдают исключение.

Из-за этого, боюсь, вам нужно сделать что-то вроде:

public interface SoftDeleteMultitenantRepository
                     extends MultiTenantCrudRepo<Foo, Long> {
 // a copy of your soft delete method here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...