복붙노트

[SPRING] Spring Data JPA로 사용자 정의 저장소를 만들려고 시도 할 때 유형 오류에 대한 속성을 찾을 수 없습니다

SPRING

Spring Data JPA로 사용자 정의 저장소를 만들려고 시도 할 때 유형 오류에 대한 속성을 찾을 수 없습니다

사용자가 업로드 한 파일의 기본 필드가있는 Media 엔터티가 있습니다. 업로드 된 파일의 바이트를 저장하기 위해 해당 기능을 보유하는 사용자 지정 리포지토리를 만들고 싶습니다. Spring 문서의 단계에 따라 다음과 같은 인터페이스를 만들었습니다.

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

이 비슷한 게시물을 찾았지만 거기에있는 제안 (모두 동일한 패키지, 명명 규칙)은 이미 수행하고있는 작업입니다. 내 모든 미디어 클래스와 인터페이스는 동일한 패키지에 있으며 "Impl"접미사를 사용하고 있습니다.

누군가가 왜이 오류가 발생하는지 그리고 어떻게 해결할 수 있는지에 대해 알려주시겠습니까? 감사.

해결법

  1. ==============================

    1.당신이 쓴 :

    당신이 쓴 :

    아니야.

    Media Bytes Repository의 이름을 Media Repository Custom으로 변경하십시오.

    물론 MediaRepositoryImpl이라는 이름으로 MediaRepositoryCustom을 구현해야합니다.

  2. ==============================

    2.impl 클래스의 이름을 "InterfaceNameImpl"로 지정해야합니다. 구현을위한 기본 접미사는 Impl이고 우리는 다음과 같이 변경할 수 있습니다.

    impl 클래스의 이름을 "InterfaceNameImpl"로 지정해야합니다. 구현을위한 기본 접미사는 Impl이고 우리는 다음과 같이 변경할 수 있습니다.

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

    커스텀 인터페이스의 이름은 중요하지 않습니다.

  3. from https://stackoverflow.com/questions/13945490/no-property-found-for-type-error-when-try-to-create-custom-repository-with-sprin by cc-by-sa and MIT license