spring-data-jpa编程中,方法参数的数据类型不一致引发的问题记录

一、代码结构

  • domain
    • model
      • BookDistributionRepository.java
  • infrastructure.persistence
    • jpa
      • BookDistributionRepositoryJPA.java
      • BookDistributionRepositoryJPAImpl.java

在这里插入图片描述

在这里插入图片描述

1、接口BookDistributionRepository.java

public interface BookDistributionRepository {List<BookDistribution> findByBookIdAndStatus(String bookId, Short status);
}

2、BookDistributionRepositoryJPA.java

import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.querydsl.QuerydslPredicateExecutor;
import org.springframework.stereotype.Repository;@Repository
public interface BookDistributionRepositoryJPA  extends MongoRepository<BookDistribution, String>,QuerydslPredicateExecutor<BookDistribution>, BookDistributionRepository {
}

3、BookDistributionRepositoryJPAImpl.java


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.*;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import java.util.List;public class BookDistributionRepositoryJPAImpl {@Autowiredprivate MongoTemplate mongoTemplate;public Iterable<BookDistribution> findByBookIdAndStatus(String bookId, short status) {Criteria criteria = Criteria.where("bookId").is(bookId);if (status != null) {criteria.and("status").is(status);}return mongoTemplate.find(new Query(criteria), BookDistribution.class);}
}

二、现象总结

  • 1、程序启动的时候,报错BookDistributionRepository中的方法不符合命名规则,这里使用了jpa。
  • 2、即使按Jpa命名规范修改方法名后,程序启动正常,但是程序在断点调试的时候,不会进入方法的实现。

1、分析

  • 程序启动的时候就报错,除了指明方法不符合Jpa规范外,还有一个疑问必须解答。那就是我有对接口的方法进行重写。BookDistributionRepositoryJPAImpl.java有没有实例化呢?
  • 另外,第一个报错还说明接口中的方法并没有被真正重写!当然,我们先要去spring BeanFactory getBean()查看是否有实例化,具体见类org.springframework.beans.factory.support.AbstractBeanFactory。经断点调试跟踪,该类不仅实例化,且方法定义也是按我们所写。
  • 接下来,要解答为什么断点调试的时候,无法进入方法的实现。只能有一种解释:重写失败。(方法重写的要求是什么,)

1、方法名称相同:重写的方法名称必须与父类中的方法名称相同,包括方法的大小写和参数列表。

2、方法参数列表相同:重写的方法的参数列表(参数的数量、类型和顺序)必须与父类中的方法的参数列表相同。

3、方法返回类型兼容:重写的方法的返回类型必须与父类中的方法的返回类型兼容。这意味着子类的返回类型可以是父类方法返回类型的子类型(子类或接口类型)或者与其相同。如果是基本数据类型,返回类型必须相同。

4、访问修饰符不严格小于父类:重写的方法的访问修饰符不能比父类中的方法更严格。具体来说,如果父类方法是 public,子类方法可以是 public、protected 或 default(包内可见),但不能是 private。如果父类方法是 protected,子类方法可以是 protected 或 public,但不能是 default 或 private。

5、不能抛出更多异常:重写的方法不能抛出比父类方法更多或更宽的异常。子类方法可以不抛出异常,也可以抛出父类方法声明的异常或其子类异常,但不能抛出父类方法未声明的新异常。

6、不能使用 static 或 final 修饰符:重写的方法不能使用 static(静态方法)或 final(不能被重写的方法)修饰符。只有非 static 和非 final 的方法才能被重写。

7、必须是子类:方法重写只能在子类中进行,子类继承父类并重写父类方法。

对方法重写的要求还挺多,经过仔细对比,不难发现接口中的方法入参类型和重写的方法入参类型不一样。 前者是Short包装类型,而后者是基本数据类型short。

2、方法重写

修改实现方法的入参类型,和接口中的保持一致,也为包装类型Short。
程序启动成功,断点调试也能够进入重写方法里。

不仅如此,反过来,接口中的方法命名也不要求符合Jpa命名规范了。

也就是说,接口中的方法是要自定义实现的话,其命名规则是随意的,不受Jpa命名规范的约束。

三、以Impl结尾的java类为什么会被自动实例

注解@EnableJpaRepositories是在spring-data-jpa框架中,它有一个参数配置,叫repositoryImplementationPostfix,其值默认便是“Impl”。

在这里插入图片描述
spring-boot-autoconfigure框架有对其进行默认开启。
在这里插入图片描述
查看JpaRepositoriesRegistrar.java,默认有开启注解EnableJpaRepositories。
在这里插入图片描述

四、总结

通过本文也再次提醒我们,java是一个强类型的语言,作为方法重写这样的一个基础知识,对参数的类型可不能大意。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/105927.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于java SpringBoot和Vue uniapp的影楼摄影预约小程序

摘要 今天信息技术的发展很快&#xff0c;其足迹在我们的生活中随处可见。它影响着我们的衣食住行等各种需求。影响也在逐渐增加&#xff0c;逐渐渗透到各行各业&#xff0c;在这种背景下&#xff0c;经过实地考察后&#xff0c;为了让婚纱照管理更加高效方便&#xff0c;我决定…

服务端 TCP 连接的 TIME_WAIT 过多问题的分析与解决

https://blog.csdn.net/zxlyx/article/details/120397006 本文给出一个 TIME_WAIT 状态的 TCP 连接过多的问题的解决思路&#xff0c;非常典型&#xff0c;大家可以好好看看&#xff0c;以后遇到这个问题就不会束手无策了。 问题描述 模拟高并发的场景&#xff0c;会出现批量…

【动态规划】01背包问题

文章目录 动态规划&#xff08;背包问题&#xff09;1. 01背包2. 分割等和子集3. 目标和4. 最后一块石头的重量 || 动态规划&#xff08;背包问题&#xff09; 1. 01背包 题目链接 状态表示 dp[i][j] 表示从前i个物品当中挑选&#xff0c;总体积不超过j,所有选法当中能挑选出…

小米汽车,能否在新能源汽车江湖站稳脚跟?

最近&#xff0c;圈内都在传小米汽车亦庄工厂已试生产近一个月&#xff0c;每周可产50辆样车&#xff0c;正在为首款新能源汽车量产做最后的准备。 此前的业绩交流会上&#xff0c;小米集团总裁卢伟冰透露&#xff0c;小米汽车结束了夏测且进展非常顺利&#xff0c;2024年上半…

前端开发纷繁复杂,是否有更高效的开发方式?

一、前言 此前&#xff0c;我曾跟大家聊到&#xff0c;低代码编程&#xff0c;在现阶段互联网业务疯狂增长的带动之下&#xff0c;被赋予了全新的使命和义务&#xff0c;即帮助开发者在前期以较低成本的方式&#xff0c;快速构建一个可投入市场的应用。 那么&#xff0c;有没有…

SpringBoot项目启动时预加载

SpringBoot项目启动时预加载 Spring Boot是一种流行的Java开发框架&#xff0c;它提供了许多方便的功能来简化应用程序的开发和部署。其中一个常见的需求是在Spring Boot应用程序启动时预加载一些数据或执行一些初始化操作。 1. CommandLineRunner 和 ApplicationRunner Spri…

串行通信协议

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、UART二、SPI二、IIC 前言 UART为异步串行通信&#xff0c;使用各自的时钟控制数据的发送和接受过程&#xff0c;不使用同步时钟&#xff0c;而是使用一些特…

平板触控笔哪款好用?好用的第三方apple pencil

而对于那些把ipad当做学习工具的人而言&#xff0c;苹果Pencil就成了必备品。但因为苹果Pencil太贵了&#xff0c;不少的学生们买不起。因此&#xff0c;最佳的选择还是平替电容笔&#xff0c;今天在这里整理了一些高性价比的电容笔&#xff01; 一、挑选电容笔的要点&#xf…

C语言学习系列-->字符函数和字符串函数

文章目录 一、字符函数1、字符分类函数2、字符转换函数 二、字符串函数1、strlen概述模拟实现 2、strcpy概述模拟实现 3、strcat概述模拟实现 3、strcmp概述模拟实现 4、有限制的字符串函数strncpystrncatstrncmp 4、strstr概述模拟实现 一、字符函数 1、字符分类函数 包含头…

常用消息中间件有哪些

RocketMQ 阿里开源&#xff0c;阿里参照kafka设计的&#xff0c;Java实现 能够保证严格的消息顺序 提供针对消息的过滤功能 提供丰富的消息拉取模式 高效的订阅者水平扩展能力 实时的消息订阅机制 亿级消息堆积能力 RabbitMQ Erlang实现&#xff0c;非常重量级&#xff0c;更适…

gitlab在项目中创建自己的分支的顺序操作,一整套流程

gitlab在项目中创建自己的分支的顺序操作&#xff0c;一整套流程 目录概述需求&#xff1a; 设计思路实现思路分析 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better…

三维模型OBJ格式轻量化压缩在大规模场景的加载和渲染的作用分析

三维模型OBJ格式轻量化压缩在大规模场景的加载和渲染的作用分析 OBJ格式是一种常用的三维模型文件格式&#xff0c;它存储了三维模型的几何信息和纹理坐标等相关属性。在大规模场景中加载和渲染三维模型时&#xff0c;OBJ格式的轻量化压缩对于提高性能和效率起到了重要的作用。…