Maven 接口方法之间引用不明确

2024-02-17

我有一个使用 EclipseLink 实现 JPA 持久性的 Java Spring 项目。我想为我的实体使用 JpaRepository 接口,并在大多数情况下使用默认实现,但我还需要定义一些我自己的方法,并且有时需要覆盖默认方法,例如 save。

我的代码在 Eclipse 中编译时可以工作,但在使用 Maven 编译时不断收到不明确的引用错误。

我所做的是这样的(例如覆盖保存,因为我需要对要保存的实体执行某些操作):

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 上运行时,它在 Eclipse 中工作得很好。对象 ReportRepository reportRepository 具有来自 JPA 存储库实现的方法和我的自定义方法,并且当我调用 reportRepository.save(...) 时会调用自定义保存方法。然而,当我执行 Maven Install 时,编译器抱怨引用不明确:

[错误] /C:/Users/Jarno/git/Korjaamotestiraportointi/src/main/java/fi/testcenter/service/ReportService.java:[40,40] 两种方法对保存的引用都不明确 保存(fi.testcenter.domain.report.Report)在 fi.testcenter.repository.ReportRepositoryCustom 和方法 save(S) 在 org.springframework.data.repository.CrudRepository 匹配

我发现我的存储库编码有点复杂。我想使用 JPA 存储库的现成实现,而不必编写任何额外的代码。我的代码让一切都变得干净整洁。在服务中用作引用的存储库接口对于每个实体都以相同的方式命名,方法也以相同的方式命名,任何自定义方法或覆盖都是通过自定义接口和实现完成的。我不需要在任何地方编写任何不必要的代码。但后来我遇到了 Maven 的问题。

我成功地使用 Maven 编译了我的代码,首先在 Eclipse Tomcat 服务器中运行它。但是如果我先执行 Maven Clean,然后执行 Maven Install,则会收到一堆错误。显然,我不想在使用 Maven 进行编译时诉诸任何形式的 hack。

那么是否有一个修复程序可以让 Maven 执行此操作?或者还有另一种方式来编码我想要在这里做的事情吗?


因此,经过大量谷歌搜索等之后,似乎不可能为 Maven 编译器定义哪种保存方法是主要的,JpaRepository 中的方法还是我的自定义存储库中的方法。我不知道 Eclipse 使用的编译器是如何做到这一点的,但显然 Maven 在这里并不遵循相同的逻辑。这是一种耻辱,因为这种编写自定义方法并覆盖某些 JpaRepository 方法的方式将是最干净、最好的方式。如果存在多个候选者,则有一个 @Primary 注释用于确定哪个 bean 是自动装配的主要 bean,但对于接口实现方法似乎没有等效的解决方案。我还没有找到任何其他方法可以做到这一点,而无需编写任何额外的代码。扩展 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() 这样的自定义方法的自定义名称,但实现的细节隐藏在实现类中。

如果有人有更好的解决方案,只需最少的代码,我很想听听。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Maven 接口方法之间引用不明确 的相关文章

  • 如何在 NetBeans 中以调试模式单步执行已实现的方法?

    我有课XImpl java它实现了一个接口X java 以及所有它的方法 我调试项目 在执行流程中遇到一个方法X processSomeValue 现在 当我尝试进入该方法时processSomeValue 我无能为力 有什么办法可以让我进
  • Jackson反序列化SNS消息错误MismatchedInputException

    我正在编写一个通过 SNS HTTP 请求处理来自 Amazon Simple Email Service 的回调的功能 我想将亚马逊提供的消息解析为本地对象结构 问题是 SNS 将 JSON 消息包装成字符串 并且 Jackson 无法解
  • 将双精度转换为二进制表示形式?

    我尝试将双精度数转换为其二进制表示形式 但使用此Long toBinaryString Double doubleToRawLongBits d 没有帮助 因为我有大量数字 Long 无法存储它们 即2 900 Long toBinaryS
  • 匿名类*总是*维护对其封闭实例的引用吗?

    我正在处理一些代码 其中一个对象 foo 正在创建另一个对象 对象 bar 并将其传递给Callable 之后 foo 将返回 bar 然后我希望 foo 变得无法访问 即 可用于 垃圾收集 我最初的想法是创建Callable匿名 例如 c
  • 通过 Session.update 和 HibernateTemplate.merge 进行 Hibernate 更新的区别

    我看到了更新操作的类型 第一的 getHibernateTemplate execute new HibernateCallback public Object doInHibernate Session session session f
  • 如何从 Jackson 中的自定义解串器调用默认解串器

    我在杰克逊的自定义解串器有问题 我想访问默认序列化器来填充我要反序列化的对象 在填充之后 我将做一些自定义的事情 但首先我想使用默认的 Jackson 行为反序列化对象 这是我目前拥有的代码 public class UserEventDe
  • Java 中内存高效的稀疏数组

    关于时间高效的稀疏数组存在一些问题 但我正在寻找内存效率 我需要相当于List
  • 使用枚举变量切换字符串

    我有一个具有不同值的枚举 并且想要切换字符串变量 现在 我在尝试将枚举值转换为字符串 可以用作大小写常量 时遇到了困难 我最好的尝试是将枚举转换为字符串数组 但开关似乎不接受数组值作为大小写常量 IntelliJ 说 需要恒定的表达 Enu
  • Java文本输出中的UTF-8编码问题

    我一直致力于测试高棉语 Unicode Wordbreaker 的各种解决方案 高棉语单词之间没有空格 这使得拼写检查和语法检查变得困难 以及从旧高棉语转换为高棉语 Unicode 我得到了一些源代码 现在在线 http www white
  • Spring 非托管 bean 的依赖注入

    我有一个非托管的 JPA 域类 它是通过实例化的new操作员 UserAccount account new UserAccount userRepository save account In my UserAccount类 我有一个be
  • 如何在不打开浏览器的情况下查看 Android 应用程序中的网页?

    嘿 我正在开发一个 Android 应用程序 我想连接到该应用程序内的网络 不过 我在某种程度上尝试过 WebView 但它在我的目录中显示的文件很好 但当连接到 google com 时 它显示错误 然后我添加了这个文件
  • 如何告诉 Eclipse 忽略 Ant build.xml 中的错误?

    我有一个使用 Maven 构建的 Eclipse 项目 并且我在 Eclipse 中使用 m2eclipse 插件来获得 Maven 支持 然而这个项目还包含一个build xml它并不用于实际构建项目 而只是用于编写脚本功能 作为项目开发
  • 码头无故停止

    我需要经验丰富的码头用户的建议 我在负载均衡器 亚马逊云 后面维护着 2 台 Linux 机器 使用 Jetty 9 0 3 有时我的 Jetty 容器会被 Thread 2 无故关闭 同时地 显示以下日志并且容器无故停止 没有错误 没有例
  • 有没有办法防止 Spring Boot 覆盖 bean?

    与春天的抽象可刷新应用程序上下文 http docs spring io spring docs current javadoc api org springframework context support AbstractRefresh
  • 如何组织课程、课程包[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 您如何决定包名称应该是什么以及什么类应该放入哪个包中 我正在开发一个项目 在该项目中 我不断添加 删除类 并且不确定我是否需要一个新包 或者应该将其添
  • 启动 Firefox 并等待其关闭

    Question 我想启动 Firefox 网络浏览器作为访问特定网站的过程 然后等到它关闭 一种特殊情况是浏览器可能已经打开并正在运行 因为用户可能已经访问过某个网站 在这种情况下 浏览器可能会在现有窗口中打开一个新选项卡 并且新启动的进
  • 尝试接收 UDP 多播时出现空指针异常

    在尝试了几次让简单的 UDP 多播接收器工作后 我感到很困惑 在我自己的代码无法按预期工作后 我尝试了 vertx 文档中发布的确切示例 DatagramSocket socket vertx createDatagramSocket ne
  • 如何在 Surefire 测试报告中显示 log4j 输出

    当 Maven 中的测试失败时 surefire 测试报告 xml 文件位于target surefire reports TEST
  • E/libEGL: validate_display:99 错误 3008 (EGL_BAD_DISPLAY) API 24 或更高版本

    当我使用 API 为 24 或更高版本的设备时 我收到此错误 E libEGL validate display 99 错误 3008 EGL BAD DISPLAY XML 代码 activity main xml
  • java 更新进度条

    我有一个 JFrame 和以下组件 JButton jButton1 Progress Bar ProgressBar 及其公共静态 JLabel 状态及其公共静态 单击按钮时会执行不同的语句 我想在每个语句后更新我的进度条 这是我的代码

随机推荐