2012-12-19 15 views
35

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.

Odpowiedz

69

Napisałeś:

się tam sugestii (wszystkie w tym samym opakowaniu, Naming Convention) to rzeczy mam już robi.

Nie, nie.

Zmień nazwę użytkownika MediaBytesRepository na MediaRepositoryCustom. Musisz mieć implementację MediaRepositoryCustom o nazwie MediaRepositoryImpl.

+19

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

+24

Zrobiłem ten sam błąd ... Podsumowując powinno być: 1) YourInterfaceName 2) YourInterfaceNameCustom 3) YourInterfaceNameImpl –

+1

Uratowałeś mój dzień. Działa jak wdzięk –

6

Musisz nazwać swoją klasę impl jako "InterfaceNameImpl". Domyślny postfiks do wdrożenia to Impl, możemy go zmienić tak, jak lubimy:

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

Nazwa niestandardowych interfejsów nie ma znaczenia.

+0

Czy to jest w pom? – santafebound

Powiązane problemy