Подтвердить что ты не робот

Не найдено свойства для ошибки типа при попытке создать пользовательский репозиторий с помощью Spring Data JPA

У меня есть объект мультимедиа, который имеет некоторые базовые поля для файлов, загруженных пользователем. Для сохранения байтов загруженных файлов я хочу создать пользовательский репозиторий, который поддерживает эту функциональность. Следуя инструкциям в Spring документации, я создал интерфейс, который выглядит следующим образом:

public interface MediaBytesRepository
{
    public byte[] getBytes(Media media) throws IOException;
    public void saveBytes(Media media, byte[] bytes) throws IOException;
    public void appendBytes(Media media, byte[] bytes) throws IOException;
    public void deleteBytes(Media media) throws IOException;
    public boolean bytesExist(Media media) throws IOException;
}

Затем я представил реализацию для этого интерфейса под названием MediaBytesRepositoryImpl

С этим я создал следующий интерфейс:

public interface MediaRepository extends JpaRepository<Media, Long>, MediaBytesRepository
{
}

Теперь, когда я запускаю сервер, я получаю следующую трассировку стека:

SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mediaRepository': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalArgumentException: Could not create query metamodel for method public abstract void com.foo.bar.core.media.MediaBytesRepository.saveBytes(com.foo.bar.core.media.Media,byte[]) throws java.io.IOException!
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:149)
.....
Caused by: java.lang.IllegalArgumentException: Could not create query metamodel for method public abstract void com.foo.bar.core.media.MediaBytesRepository.saveBytes(com.foo.bar.core.media.Media,byte[]) throws java.io.IOException!
    at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:92)
    at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateIfNotFoundQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:162)
    at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$AbstractQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:68)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.<init>(RepositoryFactorySupport.java:280)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:148)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject(RepositoryFactoryBeanSupport.java:125)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject(RepositoryFactoryBeanSupport.java:41)
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:142)
    ... 20 more
 Caused by: java.lang.IllegalArgumentException: No property save found for type class com.foo.bar.core.media.Media
    at org.springframework.data.mapping.PropertyPath.<init>(PropertyPath.java:73)
    at org.springframework.data.mapping.PropertyPath.<init>(PropertyPath.java:92)
    at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:319)
    at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:333)
    at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:301)
    at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:265)
    at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:239)
    at org.springframework.data.repository.query.parser.Part.<init>(Part.java:70)
    at org.springframework.data.repository.query.parser.PartTree$OrPart.<init>(PartTree.java:180)
    at org.springframework.data.repository.query.parser.PartTree$Predicate.buildTree(PartTree.java:260)
    at org.springframework.data.repository.query.parser.PartTree$Predicate.<init>(PartTree.java:240)
    at org.springframework.data.repository.query.parser.PartTree.<init>(PartTree.java:68)
    at org.springframework.data.jpa.repository.query.PartTreeJpaQuery.<init>(PartTreeJpaQuery.java:57)
    at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:90)
    ... 27 more

Я нашел этот аналогичный пост, но предложения там (все в том же пакете, соглашение об именах) - это вещи, которые я уже делаю. Все мои медиа-классы и интерфейсы находятся в одном пакете, и я использую суффикс "Impl".

Может кто-то пролить свет на то, почему я получаю эту ошибку и как я могу это исправить? Спасибо.

4b9b3361

Ответ 1

Вы писали:

предложения там (все в одном пакете, соглашение об именах) - это вещи, которые я уже делаю.

Нет, нет.

Переименуйте вас MediaBytesRepository в MediaRepositoryCustom.

И, конечно, вам нужна реализация MediaRepositoryCustom с именем MediaRepositoryImpl.

Ответ 2

Вы должны назвать свой класс impl как "InterfaceNameImpl". По умолчанию постфикс для реализации - Impl, мы можем изменить его, как нам нравится:

<repositories base-package="com.acme.repository" repository-impl-postfix="FooBar" />

Название пользовательских интерфейсов не имеет значения.