2017-10-28 17 views
0

EclipseLinkを使用してJPA永続性を持つJava Springプロジェクトがあります。ほとんどの場合、エンティティとデフォルトの実装にJpaRepositoryインターフェイスを使用したいと思いますが、自分のメソッドのいくつかを定義する必要があり、保存のようなデフォルトメソッドをオーバーライドする必要があります。Mavenのインターフェイスメソッド間のあいまいな参照

私のコードはEclipseでコンパイルすると機能しますが、Mavenでコンパイルするときに曖昧な参照エラーが発生します。

私が行っていることは、この(私は保存するエンティティに特定の物事を行う必要があるので、例えば保存上書きすることができます)です:私は上で実行するためにそれをコンパイルするときにこれはEclipseで正常に動作

public interface ReportRepository extends JpaRepository<Report, Long>, ReportRepositoryCustom { 

} 
public interface ReportRepositoryCustom { 

    public Report save(Report report); 
    public int getReportCountForImporter(Long importerId); 
    ... 

} 
public class ReportRepositoryCustomImplementation implements ReportRepositoryCustom { 
    public Report save(Report report) { ... } 
    public int getReportCountForImporter(Long importerId) { ... } 
} 

public class ReportService { 
    @Autowired 
    private ReportRepository reportRepository; 
} 

Tomcat。オブジェクトReportRepository reportRepositoryにはJPAリポジトリ実装のメソッドとカスタムメソッドがあり、reportRepository.save(...)を呼び出すとカスタム保存メソッドが呼び出されます。しかし、私はMavenをインストールするか、コンパイラはあいまいな参照文句:

[ERROR] /C:/ユーザー/ヤルノ/ gitの/ Korjaamotestiraportointi/srcに/メイン/ javaの/ FI/testcenter /サービス/ ReportService.java:[40,40] 保存への参照はあいまいです両方のメソッド fi.testcenter.repository.ReportRepositoryCustomおよびメソッドsave(S) in org.springframeworkに保存(fi.testcenter.domain.report.Report) .data.repository.CrudRepository match

私のリポジトリは少し複雑です。 JPAリポジトリ用の既成の実装を使用したいと思います。余分なものをコーディングする必要はありません。私のコードは、すべてをきれいに保ちます。サービスの参照として使用されるリポジトリインタフェースは、すべてのエンティティに対して同じ方法で名前が付けられ、メソッドも同じ名前が付けられ、カスタムメソッドやオーバーライドはカスタムインターフェイスと実装を通じて行われます。不要なコードをどこにでも書く必要はありません。しかし、私はMavenで私の問題に遭遇しました。

Eclipse Tomcatサーバーで初めてMavenを実行して、自分のコードをMavenでコンパイルすることができました。しかし、Maven CleanをインストールしてからMavenをインストールすると、エラーが発生します。そして明らかに、私はMavenでコンパイルする際に何らかのハックに頼る必要はありません。

Mavenでこれを行うための修正がありますか?あるいは、私がここでやりたいことをコーディングする別の方法がありますか?

+0

[Spring JPA CrudRepsoitoryクラスに既に保存方法があります](https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/repository/CrudRepository.html#save- S-)、なぜ同じ署名であなた自身を守っているのですか? –

+0

@Sagar Rohankarエンティティをデータベースに保存する前に、特定の処理を行う必要があるため、デフォルトのメソッドをオーバーライドします。メソッドの名前を別にしたくないので、特定のエンティティでsave以外の名前でカスタムメソッドを呼び出す必要があることを覚えておく必要があります。 – hubbabubba

+0

は 'ReportRepository'インターフェースで' ReportRepositoryCustom'を拡張しません。 –

答えて

0

多くのグーグルなどの後で、Mavenのコンパイラでは、保存メソッドがプライマリ、JpaRepositoryのもの、または私のカスタムリポジトリにあるものを定義できないようです。私はEclipseで使用されているコンパイラがどのように使用されているか分かりませんが、明らかにMavenはここで同じロジックに従いません。カスタムメソッドをコーディングし、いくつかのJpaRepositoryメソッドをオーバーライドするこの方法は、最もクリーンで素敵な方法なので、残念です。いくつかの候補が存在する場合、どのbeanがautowiringのためにプライマリであるかを判断するための@Primaryアノテーションがありますが、インタフェース実装メソッドには同等の解決策はないようです。私は余分なコードを書く必要がないところでこれを行う方法は他にありませんでした。 SimpleJpaRepositoryクラスの拡張は、実装がJpaRepository実装として使用されていることを確認しなければならないので、やや醜い解決策のように思えます。

だから私はまっすぐ進む方法でこれを解決することを決定しました:

public interface ReportRepository { 
    public List<Report> findAll(); 

    public Report findOne(Long id); 

    public void delete(Report report); 

    public Report save(Report report) throws OptimisticLockException; 

    public Long getReportCountForImporter(Long importerId); 

    .... [other custom methods] 

} 

public interface ReportRepositoryDefaultMethods extends JpaRepository<Report, Long> { 

} 

public class ReportRepositoryImpl implements ReportRepository { 

    @PersistenceContext() 
    EntityManager entityManager; 

    @Autowired 
    ReportRepositoryDefaultMethods reportRepositoryDefaultMethods; 

    public List<Report> findAll() { 
     return reportRepositoryDefaultMethods.findAll(); 
    } 

    public Report findOne(Long id) { 
     return reportRepositoryDefaultMethods.findOne(id); 
    } 

    public void delete(Report report) { 
     reportRepositoryDefaultMethods.delete(report); 
    } 

    @Transactional 
    public Report save(Report report) throws OptimisticLockException { 
     [custom implementation using entityManager methods] 

    } 
    .... [other custom methods] 
} 

私はちょうど呼び出しで、私は私のインターフェイスとその実装に使用するデフォルトの方法を含める必要があるためそれはきちんと解決策ではありません標準のJpaRepositoryメソッドに追加します。しかし、それは動作し、私のReportRepositoryインターフェイスの使用は、私はcustomSave()のようなカスタムメソッドのカスタム名を持っていないという点できれいですが、実装の詳細は実装クラスに隠されています。

誰かがより良い解決策を持っていれば、最小のコード量しか持たない人なら、それについて聞いてみたいと思います。

関連する問題