使用Spring Data JPA接口调用Intellij中的模糊方法

时间:2016-01-13 21:41:58

标签: java intellij-idea spring-data-jpa intellij-14

intellij报告了一个奇怪的模糊方法调用错误。我正在使用spring数据JPA接口,该接口也实现了具有相同方法签名的接口:

UserRepository:

@Repository
public interface UserRepository extends CrudRepository<User, String>, UserProvider {
} 

UserProvider:

public interface UserProvider {
    User findOne(String userId);
}

除了需要第二个接口的原因之外,我假设因为这些是接口并且findOne的方法签名是相同的,所以编译器在处理歧义时没有问题。我不正确理解Java,还是这是一个intellij问题?这是通过泛型解析CrudRepository接口的问题吗?

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。在我的情况下,我的IDE(Eclipse)没有报告错误,但是当从控制台通过Maven构建项目时,我在testCompile期间遇到了关于方法歧义的错误。

我怀疑这是由Eclipse和Maven使用的不同Java编译器实现的,但即使我验证它们都使用相同的JDK(jdk1.8.0_91),问题仍然存在。

然而,在花了几个小时之后,我设法通过使用@RepositoryDe​​finition注释我的存储库而不是从CrudRepository扩展它来克服这个问题。使用您的样本,它将是:

@RepositoryDefinition(domainClass = User.class, idClass = String.class)
public interface UserRepository extends UserProvider {
}

答案 1 :(得分:0)

我相信 findOne 现在是 findById,我遇到了同样的错误。我发现即使 IntelliJ 报告这些方法具有相同的签名,但它们实际上并不具有相同的签名,因为 CrudRepository 是通用的,而我的不是。

我相信如果您将 UserProvider 更新为泛型,错误就会消失:

// UserRepository
@Repository
public interface UserRepository extends CrudRepository<User, String>, UserProvider {
} 
// UserProvider
public interface UserProvider<E, ID> {
    E findOne(ID userId);
}