2017-05-06 8 views
1

新しいカスタムメソッドを追加するのにエラーが発生するようにベースリポジトリクラスを作成しようとしています。春データカスタムメソッドエラー:org.springframework.data.mapping.PropertyReferenceException:型の型xxxが見つかりません

@NoRepositoryBean 
public interface XRepository<T, ID extends Serializable> extends JpaRepository<T, ID> { 
Optional<T> xxx(ID id); 
} 

public class XRepositoryImpl<T, ID extends Serializable> extends SimpleJpaRepository<T, ID> implements XRepository<T, ID> { 

    private final EntityManager entityManager; 

    public XRepositoryImpl(JpaEntityInformation entityInformation, EntityManager entityManager) { 
     super(entityInformation, entityManager); 
    } 

    @Override 
    public Optional<T> xxx(ID id) { 
     return Optional.ofNullable(findOne(id)); 
    } 
} 

public interface BookRepository extends XRepository<Book, Long> { 
} 

スタックトレース:

Caused by: org.springframework.data.mapping.PropertyReferenceException: No property xxx found for type Book! 
at org.springframework.data.mapping.PropertyPath.<init>(PropertyPath.java:77) ~[spring-data-commons-1.12.6.RELEASE.jar:na] 
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:329) ~[spring-data-commons-1.12.6.RELEASE.jar:na] 
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:309) ~[spring-data-commons-1.12.6.RELEASE.jar:na] 

私は同じ問題への答えをチェックしましたが、彼らは助けにはなりませんでした。彼らは命名規則を指摘していますが、私はそれに何ら問題はありません。

+0

を使用していますか? – manish

+0

私は追加の設定をしませんでした。私はベースからリポジトリ(_BookRepository_)を拡張することが十分だと思った – Ozzy

+0

それは単にリポジトリのカスタム実装を提供するだけでは不十分です。また、Springデータインフラストラクチャにカスタム実装を指す必要があります。詳細については、[参考資料](https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.custom-behaviour-for-all-repositories)を参照してください。 – manish

答えて

0

として、 @Manishは、欠けていた設定があったと指摘しました。

カスタムデータをSpringデータインフラストラクチャに認識させるにはZEDリポジトリ 基底クラス@EnableJpaRepositoriesこのカスタム実装をピックアップして春データJPAを設定しているどのように

@Configuration 
@EnableJpaRepositories(repositoryBaseClass = XRepositoryImpl.class) 
class ApplicationConfiguration { … } 
-1

あなたはSpring Data JPAを使用しています。リポジトリに@Repositoryを使用する必要があります。また、以下のコードをApplicationContext.xmlに使用します。

<context:component-scan annotation-config="true" 
    base-package="com.demo.test" /> 

<context:annotation-config /> 
<jpa:repositories base-package="com.demo.test.repository" /> 
<tx:annotation-driven transaction-manager="transactionManager" /> 
+1

スプリングリポジトリは@Repositoryアノテーションなしでも選択されます。 – pvpkiran

0

スプリングデータmongoは、クラスの命名規則に基づいて動作します。リポジトリ・インタフェースの名前がXXXRepositoryの場合、カスタム・リポジトリ・インタフェースの名前はXXXRespositoryCustom(RepositoyName + Custom)とし、実装クラスの名前はXXXRepositoryImplにする必要があります。あなたのカスタム実装だけが読み込まれます。

0

あなたは近くにいますが、あなたのクラス名はあなたの問題の原因です。このお試しください:あなたの現在のクラス定義では

public interface XRepositoryOperations<T, ID extends Serializable> { 
    Optional<T> xxx(ID id); 
} 

public interface BookRepository extends JpaRepository<Book, Long>, XRepositoryOperations<Book, Long> { 
} 

public class XRepositoryImpl<T, ID extends Serializable> implements XRepositoryOperations<T, ID> { 

    @Autowired private BookRepository bookRepository; 

    @Override 
    public Optional<T> xxx(ID id) { 
     return Optional.ofNullable(bookRepository.findOne(id)); 
    } 
} 

を、春には、APIを実装するために使用されるクラスとしてXRepositoryにBookRepositoryを通して見ています。あなたのmethod-name-to-query translationを使用してxxxメソッドを実装しようとしています。このメソッドの自動実装からメソッドを除外したい場合は、それらを別のインタフェースで定義し、リポジトリインタフェースでそのメソッドを拡張する必要があります。これは、定義するリポジトリクラスImplで実装されるクラスです。

編集

別のオプション、あなたは、Java 8を使用して、基本クラスのすべてを維持したい、xxxメソッドのデフォルトの実装を提供することですしている場合:

public interface XRepository<T, ID extends Serializable> extends JpaRepository { 

    default Optional<T> xxx(ID id) { 
     return Optional.ofNullable(this.findOne(id)); 
    } 

} 
+1

私はベースリポジトリクラスを持っています。私は、基本クラスにフィールドとしての子クラスを持たせることは良い設計だとは思わない。 – Ozzy

+0

ここでのオプションは限られています。ベースリポジトリクラスにカスタムメソッドが必要な場合は、1)自動クエリージェネレータがそれを受け入れるように名前をつけ、2)クエリー定義で '@ Query'アノテーションを提供する必要があります(' Optional は 'findOne'操作のための有効な戻り型です)、または3)デフォルトの実装を提供します(上記の私の編集を参照してください)。 – woemler

関連する問題