2012-12-19 15 views
35

के साथ कस्टम रिपॉजिटरी बनाने का प्रयास करते समय टाइप त्रुटि के लिए कोई प्रॉपर्टी नहीं मिली है मेरे पास एक मीडिया इकाई है जिसमें उपयोगकर्ता द्वारा अपलोड की गई फ़ाइलों के लिए कुछ बुनियादी फ़ील्ड हैं। अपलोड की गई फ़ाइलों के बाइट्स को सहेजने के लिए, मैं एक कस्टम रिपोजिटरी बनाना चाहता हूं जो उस कार्यक्षमता को रखे।स्प्रिंग डेटा जेपीए

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

इस के साथ

कहा जाता है के लिए एक कार्यान्वयन प्रदान की है, मैं उसके बाद निम्न इंटरफ़ेस बनाया: Spring documentation में दिए गए चरणों के बाद, मैं एक अंतरफलक है कि इस तरह दिखता है बना लिया है

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 
:
public interface MediaRepository extends JpaRepository<Media, Long>, MediaBytesRepository 
{ 
} 

अब, जब मैं सर्वर शुरू, मैं निम्नलिखित स्टैक ट्रेस मिल

मुझे यह similar post मिला, लेकिन वहां सुझाव (सभी पैकेज में, सम्मेलन नामकरण) वे चीजें हैं जो मैं पहले से कर रहा हूं। मेरे सभी मीडिया वर्ग और इंटरफेस एक ही पैकेज में हैं, और मैं "आईएमएल" प्रत्यय का उपयोग कर रहा हूं।

क्या कोई इस बारे में कुछ प्रकाश डाल सकता है कि मुझे यह त्रुटि क्यों मिल रही है और मैं इसे कैसे ठीक कर सकता हूं? धन्यवाद।

उत्तर

69

आप ने लिखा है:

वहाँ सुझाव (एक ही पैकेज में सभी, नामकरण सम्मेलन) बातें मैं पहले से ही कर रहा हूँ कर रहे हैं।

नहीं, आप नहीं करते हैं।

आपको MediaBytesRepository से MediaRepositoryCustom का नाम बदलें।

और निश्चित रूप से आपको नाम के साथ MediaRepositoryCustom के कार्यान्वयन की आवश्यकता है।

+19

ऐसा लगता है कि मुझे गलत समझा जाता है कि चीजों को कैसे नामित किया जाना चाहिए। आपके उत्तर के बाद मैंने फिर से प्रलेखन को देखा और महसूस किया कि मेरे कार्यान्वयन वर्ग का नाम स्प्रिंग डेटा इंटरफ़ेस + "इम्प्ल" का नाम होना चाहिए और मेरे इंटरफ़ेस + "इम्प्ल" का नाम नहीं होना चाहिए। इसलिए, मैं अपने इंटरफेस 'MediaBytesRepository' का नाम रखने में सक्षम था और मुझे बस' MediaBytesRepositoryImpl' के बजाय कार्यान्वयन 'MediaRepositoryImpl' नाम देना पड़ा। सहायता के लिए धन्यवाद। – dnc253

+24

वही गलती की गई ... सारांशित करने के लिए यह होना चाहिए: 1) आपका इंटरफेसनाम 2) आपका इंटरफेसनाम क्लाइंट 3) YourInterfaceNameImpl –

+1

आपने मेरा दिन बचाया। आकर्षण –

6

आपको अपने इंपोर्ट क्लास को "InterfaceNameImpl" के रूप में नामित करना होगा।

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

कस्टम इंटरफेस का नाम कोई फर्क नहीं पड़ता: लागू करने के लिए डिफ़ॉल्ट पोस्टफ़िक्स के रूप में हम चाहते Impl, हम इसे बदल सकता है।

+0

क्या यह पोम में है? – santafebound

संबंधित मुद्दे