ユーザーがアップロードしたファイルのいくつかの基本的なフィールドを持つMediaエンティティがあります。アップロードされたファイルのバイトを保存するために、その機能を保持するカスタムリポジトリを作成します。 Spring documentation の手順に従って、次のようなインターフェイスを作成しました。
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
私はこれを見つけました similar post 、しかしそこの提案(すべて同じパッケージ、命名規則)は私がすでにやっていることです。すべてのメディアクラスとインターフェイスは同じパッケージにあり、「Impl」サフィックスを使用しています。
誰かがこのエラーを受け取った理由と修正方法を明らかにしてください。ありがとう。
あなたが書いた:
そこにある提案(すべて同じパッケージ、命名規則)は、私がすでにやっていることです。
いいえ、あなたはしません。
名前をMediaBytesRepository
からMediaRepositoryCustom
に変更します。
そしてもちろん、MediaRepositoryCustom
という名前のMediaRepositoryImpl
の実装が必要です。
Implクラスに「InterfaceNameImpl」という名前を付ける必要があります。実装のデフォルトの接尾辞はImplです。必要に応じて変更できます。
<repositories base-package="com.acme.repository" repository-impl-postfix="FooBar" />
カスタムインターフェイスの名前は重要ではありません。