使用 Spring Data JPA 接口在 Intellij 中进行不明确的方法调用
Ambiguous method call in Intellij with Spring Data JPA interface
intellij 报告了一个奇怪的模棱两可的方法调用错误。我正在使用 spring 数据 JPA 接口,该接口还实现了具有相同方法签名的接口:
用户资料库:
@Repository
public interface UserRepository extends CrudRepository<User, String>, UserProvider {
}
用户提供者:
public interface UserProvider {
User findOne(String userId);
}
除了需要第二个接口的原因,我假设因为这些是接口并且 findOne 的方法签名是相同的,所以编译器处理歧义没有问题。我不理解 Java 对吗,或者这是一个 intellij 问题?这是通过泛型解析的 CrudRepository 接口的问题吗?
我遇到过同样的问题。在我的例子中,我的 IDE (Eclipse) 没有报告错误,但是当从控制台通过 Maven 构建项目时,我在 testCompile 期间遇到了关于方法歧义的错误。
我怀疑这与 Eclipse 和 Maven 使用的不同 Java 编译器有关,但即使我确认它们都使用相同的 JDK (jdk1.8.0_91).
然而,在这上面花了几个小时后,我设法通过使用 @RepositoryDefinition 注释我的存储库而不是从 CrudRepository 扩展它来克服这个问题。使用您的示例,它将是:
@RepositoryDefinition(domainClass = User.class, idClass = String.class)
public interface UserRepository extends UserProvider {
}
我相信 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);
}
intellij 报告了一个奇怪的模棱两可的方法调用错误。我正在使用 spring 数据 JPA 接口,该接口还实现了具有相同方法签名的接口:
用户资料库:
@Repository
public interface UserRepository extends CrudRepository<User, String>, UserProvider {
}
用户提供者:
public interface UserProvider {
User findOne(String userId);
}
除了需要第二个接口的原因,我假设因为这些是接口并且 findOne 的方法签名是相同的,所以编译器处理歧义没有问题。我不理解 Java 对吗,或者这是一个 intellij 问题?这是通过泛型解析的 CrudRepository 接口的问题吗?
我遇到过同样的问题。在我的例子中,我的 IDE (Eclipse) 没有报告错误,但是当从控制台通过 Maven 构建项目时,我在 testCompile 期间遇到了关于方法歧义的错误。
我怀疑这与 Eclipse 和 Maven 使用的不同 Java 编译器有关,但即使我确认它们都使用相同的 JDK (jdk1.8.0_91).
然而,在这上面花了几个小时后,我设法通过使用 @RepositoryDefinition 注释我的存储库而不是从 CrudRepository 扩展它来克服这个问题。使用您的示例,它将是:
@RepositoryDefinition(domainClass = User.class, idClass = String.class)
public interface UserRepository extends UserProvider {
}
我相信 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);
}