Mam jednostkę Media, która ma kilka podstawowych pól dla plików przesłanych przez użytkownika. W celu zapisania bajtów przesłanych plików chcę utworzyć niestandardowe repozytorium, które posiada tę funkcję. Po etapach w Spring documentation, stworzyłem interfejs, który wygląda tak:Nie znaleziono właściwości dla błędu typu podczas próby utworzenia niestandardowego repozytorium za pomocą Spring Data JPA
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;
}
Potem pod warunkiem implementację tego interfejsu o nazwie MediaBytesRepositoryImpl
Z tym, że wówczas utworzony następujący interfejs:
public interface MediaRepository extends JpaRepository<Media, Long>, MediaBytesRepository
{
}
teraz, kiedy uruchomić serwer, pojawia się następujący ślad stosu:
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
Znalazłem to similar post, ale sugestie tam (wszystko w tym samym pakiecie, konwencja nazewnictwa) są rzeczy, które już robię. Wszystkie moje klasy mediów i interfejsy są w tym samym pakiecie i używam sufiksu "Impl".
Czy ktoś może rzucić trochę światła na to, dlaczego dostaję ten błąd i jak mogę go naprawić? Dzięki.
Wygląda na to, że źle zrozumiałem, jak rzeczy mają być nazywane. Po twojej odpowiedzi ponownie przejrzałem dokumentację i zdałem sobie sprawę, że nazwa mojej klasy implementacji musi być nazwą interfejsu Spring Data + "Impl", a nie nazwą mojego interfejsu + "Impl". Tak więc byłem w stanie zachować nazwę mojego interfejsu 'MediaBytesRepository' i musiałem tylko nazwać implementację' MediaRepositoryImpl' zamiast 'MediaBytesRepositoryImpl'. Dzięki za pomoc. – dnc253
Zrobiłem ten sam błąd ... Podsumowując powinno być: 1) YourInterfaceName 2) YourInterfaceNameCustom 3) YourInterfaceNameImpl –
Uratowałeś mój dzień. Działa jak wdzięk –