2012-12-19 15 views
35

Kullanıcı tarafından yüklenen bazı dosyalar için bazı temel alanlara sahip bir Medya var. Yüklenen dosyaların baytlarını kaydetmek için, bu işlevselliği tutan özel bir depo oluşturmak istiyorum. Bunun sayesinde MediaBytesRepositoryImplSpring Data ile özel depo oluşturmaya çalışırken tür hatası için bir özellik bulunamadı JPA

denilen bu arayüz için bir gerçekleme sağladı Sonra

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; 
} 

, ben sonra aşağıdaki arayüz oluşturdu: Spring documentation adımların ardından, şöyle bir arayüz oluşturduk

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 
: Ben sunucu başlatıldığında Şimdi
public interface MediaRepository extends JpaRepository<Media, Long>, MediaBytesRepository 
{ 
} 

, ben şu yığın izleme almak

Bu similar post numaralı belgeyi buldum, ancak önerileri (tümü aynı pakette, adlandırma kuralı) zaten yaptığım şeyler. Tüm medya sınıflarım ve arabirimlerim aynı pakette ve "Impl" soneki kullanıyorum.

Birisi neden bu hatayı aldığımı ve nasıl düzeltebileceğimi açıklayabilir mi? Teşekkürler.

cevap

69

yazmıştın: Orada

öneriler (aynı pakette hepsi adlandırma kuralı) Zaten yapıyorum şeylerdir.

Hayır yok.

MediaRepositoryCustom için MediaBytesRepository için yeniden adlandırın.

Ve tabiki de MediaRepositoryImpl adıyla MediaRepositoryCustom uygulamasına ihtiyacınız vardır.

+19

Bazı şeylerin nasıl adlandırılacağını yanlış anladım gibi görünüyor. Cevabınızdan sonra yeniden belgelere baktım ve uygulamacı sınıfımın adının, Spring Data arayüzünün + "Impl" isminin olması gerektiğini ve "Impl" arayüzünün adını değil. Bu yüzden, 'MediaBytesRepository' ara yüzümün adını tutabildim ve MediaBytesRepositoryImpl 'yerine MediaRepositoryImpl' işlevini adlandırmak zorunda kaldım. Yardım için teşekkürler. – dnc253

+24

Aynı hatayı yaptı ... Özetlemek gerekirse: 1) ArayanınızAdı 2) TanımlamanızAdıÖdeme 3) Sizin TanımlamanızNameImpl –

+1

Günümü kurtardınız. Çekicilik gibi çalışıyor –

6

Impl sınıfınızı "InterfaceNameImpl" olarak adlandırmanız gerekir. özel arayüzler

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

adı önemli değil: uygulanması için varsayılan sonek biz gibi Impl, bunu değiştirebilirsiniz olduğunu.

+0

Bu, pomda mı? – santafebound

İlgili konular