Не получается переопределить метод репозитория Spring Data JPA
В документации вроде все легко, понятно и просто. Метод ни как не хочет генерироваться - вместо переопределенного метода вызывается стандартный метод findAll().
Пытаюсь переопределить метод Page findAll(Pageable pageable); стандартного репозитория PagingAndSortingRepository<T, S>:
Репозиторий:
@Repository
public interface EntityRepository extends PagingAndSortingRepository<Entity, Long>, CustomisedEntityRepository<Entity> {
@Override
Page<Entity> findAll(Pageable pageable);
}
Интерфейс с переопределяемым методом:
@NoRepositoryBean
public interface CustomisedEntityRepository<T> {
Page<T> findAll(Pageable pageable);
}
Класс, с реализацией переопределяемого метода:
public class CustomisedEntityRepositoryImpl<T> implements CustomisedEntityRepository<T> {
@PersistenceContext
private EntityManager em;
private final Logger logger = LoggerFactory.getLogger(CustomisedUntityRepositoryImpl.class);
@Autowired
private AdminService adminService;
@Override
@Transactional
public Page<T> findAll(Pageable pageable) {
Logger.debug("This is a body of overridden method")
//There is some user's implementation here
}
//and others private methods
}
Собственно, к чему это все. Изначально я хотел не переопределить метод, а реализовать кастомный метод полностью, вроде того: Page simpleMethod(Map<String, String> parameters, Pageable pageable). Но артефакт отказывался деплоиться, ссылаясь на то, что у типа Entity отсутствует свойство simpleMethod. Как я понял, Spring не пытался создать кастомный метод, а упорно пытался сгенерировать какой-то базовый метод, опираясь на название моего, что-то вроде findByName и тщательно искал свойство simpleMethod в моем Entity, погуглив денек, я так и не нашел ответов и решил попробовать стандартный метод переопределить, но и тут что-то пошло не так.
Буду крайне благодарен, если кто-то знает что-то чего до сих пор не знаю я, поделитесь или может быть где-то есть какая-то ошибка в коде. Прегуглил весь гугл, но решение не находится.
Всем спасибо за внимание и потраченное время!
Ответы (1 шт):
Добрый день. В своем вопросе Вы упоминаете документацию, но поскольку ссылку Вы не приводите, предположу, что речь про эту документацию.
Помимо этого, я недавно решал вопрос о переопределении стандартного метода Optional<T> findById(ID id); из CrudRepository<T, ID>, пытаясь добавить в его логику стандартную обработку Optional<T> и не писать ее в сотне мест кода где должен быть вызван findById(ID id). Я не смог оставить прежним название метода т.к. при этом нужна сигнатура отличная от оригинальной. Я создал новый интерфейс:
@NoRepositoryBean
public interface JpaRepositoryRedefined<T, ID extends Serializable> extends JpaRepository<T, ID> {
default T findByIdRedefined(ID id) {
return findById(id)
.orElseThrow(() -> new ObjectNotFoundException("Entity with id = " + id + " not found"));
}
}
который вставил везде где ожидался JpaRepository<T, ID> и для получения сущностей соответственно стал использовать метод findByIdRedefined.