JavaDev
文章平均质量分 82
java记录dev
-代号9527
逢山开路,遇水搭桥!纸上得来终觉浅,绝知此事要躬行。
展开
-
Java中调用第三方接口
考虑到远程调用可能失败,失败后重试三次,以上面的hutool为例来实现,其余的都一样,主要还是一个是否成功标记位 + 一个计数,successFlag不用voilate,并发安全也不用考虑,线程内部调用的,用到的数存栈里了都。上面的RestTemplate,在调三方接口时挺好用的,但微服务架构下,各个微服务之间调用时,url就不好写,由此,用Feign:一个声明式的http客户端。和getForEntity的区别是,getForObject只有一个响应的内容,响应码、响应头等没有。原创 2024-09-04 01:00:28 · 1139 阅读 · 1 评论 -
同步、异步、回调函数
测试效果的话,就new A(),然后调用其a方法就行,上面代码没有进行必要的日志打印和Thread.sleep模拟异步停顿,可能视觉效果不明显,但意思就是这个意思。此时,方法a调用methodB,没问题,但以后再有方法c调用methodB,但其回调逻辑变了,是call_back_2呢?也即,如果方法a需要在方法b执行完成后,再做一点其余操作,或者说需要对方法b的执行结果进行监听呢 ==> 回调函数。如此,传入对应的Callback接口的实现类,就能在B类中调用对应的回调逻辑,类B一般也就不用更改了。原创 2024-09-02 18:43:21 · 551 阅读 · 0 评论 -
JSON处理库 -- Fastjson
实现FastJson的SerializeFilter接口,进行高度的定制化自定义序列化。PropertyFilter用于序列化时过滤掉特定的属性@Override// 例如,排除所有值为 null 的属性= null;// 示例// 设置属性NameFilter用于序列化时修改字段的名称@Override// 例如,将字段名转为大写ValueFilter用于序列化时,修改字段的值@Override// 例如,将所有字符串值转为大写。原创 2024-09-01 22:16:33 · 1113 阅读 · 0 评论 -
Java分布式锁
一个微服务有多个实例,或者说多个pod,也就有多个JVM,此时,想保证不同实例里的线程同步执行,靠synchronized这种JVM级别的锁就不能实现了,而要通过分布式锁,一种独立于JVM之外的锁原创 2024-08-26 01:21:34 · 779 阅读 · 0 评论 -
git回退未commit、回退已commit、回退已push、合并某一次commit到另一个分支
在一个分支修改代码后,还没commit提交,不想要这些修改了,想回到刚开始的样子。在一个分支修改代码并commit到了本地仓库,但没push到远程仓库,想回到刚开始的样子。最近一次的push我不要了原创 2024-07-31 13:31:39 · 1084 阅读 · 0 评论 -
系统数据加密传输的实现
针对以上要加密的数据,用户密码处理的流程图如下:修改注册后端接口,用户注册时,提交密码,前端用公钥对密码进行加密后,传到后端服务器。对邮箱名、手机号等信息,可非对称加密,也可使用AES对称加密,实现加密传输,加密落库则可有可无,如果选择了加密落库,可能会影响到之前的userList接口等等,总之明文、密文别转换叉了。修改后端登录接口,登录时,前端传来的密码,解密后传到SpringSecurity框架,如果账户是加密传输的,也需解密,因为框架里要loadUserByUsername,用户名得转换过来。原创 2024-07-10 20:26:04 · 1312 阅读 · 0 评论 -
策略模式 + 抽象工厂实现多方式登录验证
每种登录就是实现登录这个目的的一种策略,因此先想到的应该是策略模式,所有具体策略类所需要实现的接口就是抽象策略类的login方法。其次,前端传不同的type,要调用不同的具体策略类对象,如此,再引入工厂模式。因为不同的第三方供应商系统有不同的认证方式,想实现打通,就要有不同的具体策略类(比如策略类A是通过appid完成认证,策略类B是通过密钥完成认证),因此考虑使用了策略模式。这样写,以后再增加新的登录方式,工厂类还得改,为了解耦,使用配置文件,不同的登录方式的type,对应一个登录方式的具体策略类。原创 2024-06-24 20:02:38 · 1527 阅读 · 0 评论 -
线程池的使用:批量导入、数据汇总、异步保存搜索记录
也可以使用CountDownLatch,线程池的线程每处理一个提交的任务,就让CountDownLatch减一(CountDownLatch初始化等待计数等于批次数),阻塞请求过来的那个线程,直到CountDownLatch减为0,最后统计下总耗时,返回给前端。在一个电商网站中,用户下单之后,需要查询数据,数据包含了三部分:订单信息、包含的商品、物流信息。搜索时,保存历史搜索记录。用户搜索一个keyword时,存历史搜索记录,不能影响到查询的性能,用异步去处理,将存历史记录的任务提交到线程池。原创 2024-06-12 17:08:22 · 1197 阅读 · 0 评论 -
Java后端设置服务器允许跨域
简言之就是发送OPTION请求到服务器,服务器根据预检请求的请求头信息,自行判断是否允许跨域,并把判断结果放到响应的header中返回给浏览器。预检请求的请求头中包含了一些关键信息,例如请求方法、请求头字段、请求的URL等。这个示例中,浏览器向 https://www.example.com 发送了一个OPTIONS请求,用于检查是否允许发送POST请求,并且是否允许包含Content-Type请求头字段。以下通过servlet的Filter给所有响应的header加了一些跨域相关的数据,以实现允许跨域。原创 2024-03-25 17:44:17 · 2148 阅读 · 0 评论 -
拖动排序与置顶的Java实现
整理个需求的实现思路。原创 2024-03-16 09:00:00 · 894 阅读 · 0 评论 -
用k8s私有化部署docsify做开放API平台
参照模板:【工行的API开放平台】API开放平台,用于给第三方系统做接入用,开放的自然也是用于对接的那部分API。主要有两类:前者简单,后者得考虑鉴权、限流等问题。这类API开放平台不需要考虑在线调用,能展示就行,实现方式可考虑:关于第三种的具体思路:关于API文档内容的维护,可考虑采用上传word文档或者在线富文本框的方式,提到后端,后端转md或其他前端需要的格式后,返回给前端。这种实现类似工行的开放平台,优点是灵活,自己爱咋展示咋展示,维护、上下架接口、编辑、删除都可以做成一个前端页面,可以在线操作,原创 2024-01-25 19:15:53 · 1424 阅读 · 1 评论 -
注解实现校验接口传参是否超出取值范围
Target(ElementType . FIELD) @Constraint(validatedBy = ListValue . ValidIfInRange . class) //借助@Constraint注解实现自定义校验逻辑,validatedBy属性是数组类型,可同时定义多种校验逻辑 @Retention(RetentionPolicy . RUNTIME) @Documented public @interface ListValue {原创 2024-01-17 18:42:02 · 797 阅读 · 0 评论 -
SpringBoot对接支付宝完成扫码支付
需求:系统A对接支付宝,实现支持用户扫码支付。原创 2023-12-22 20:13:08 · 1660 阅读 · 4 评论 -
局部变量类型推断:val和var
翻项目代码,好多地方在用val定义变量,这里整理下。原创 2023-12-11 10:45:28 · 445 阅读 · 0 评论 -
SpringBoot整合ZXing创建二维码和条形码
之前SpringSecurity时,登录用到了图片验证码辅助登录:【】,以下为整合zxing实现二维码和条形码的生成。原创 2023-12-11 09:08:58 · 738 阅读 · 0 评论 -
反射加载SDK完成统一调用
半路接手一个需求,需要从自己系统出发,经过的统一校验和转发,来请求第三方供应商系统的接口,整理下看同事代码学到的一点思路。原创 2023-12-08 11:15:35 · 912 阅读 · 0 评论 -
@JsonCreator和@JsonValue
此时,前端传个dto(json)过来,dto里有个参数的类型是枚举类型,反序列化json成dto对象时,枚举类型的属性也会反序列化,上面@JsonCreator定义的unSerializer方法执行,就会完成参数合法性校验,Service层省事了。比如一个枚举类的get方法上加上该注解,那么在序列化这个枚举类的对象时,返回的就是枚举对象的这个属性,而不是这个枚举对象的序列化json串。一个类只能用一个,加上这个注解时,该类的对象序列化时就会只返回这个字段的值做为序列化的结果。原创 2023-11-23 09:49:54 · 2230 阅读 · 0 评论 -
Java计算时间差,距结束还有几天几小时几分钟
上面的toHours()方法返回的是时间差全部换算为小时的数值,而不时去掉整天以后的整小时,想获得后者,应该调用toHoursPart()方法原创 2023-11-22 15:28:07 · 1331 阅读 · 2 评论 -
ApplicationContext对象的获取
ApplicationContext 代表 Spring IoC 容器,其中包含应用程序创建的所有 Bean。它负责实例化、配置和创建 Bean。原创 2023-11-07 20:07:50 · 1166 阅读 · 0 评论 -
【Java】cron表达式
L和W可以一起组合在日字段使用。表示当月的最后一个工作日触发事件原创 2023-10-05 18:22:16 · 505 阅读 · 0 评论 -
Java中的Lambda表达式与双冒号::的用法
Lamdba是Java1.8的一大亮点,它会使代码更加简洁通过Lambda,可以代替之前用匿名内部类去实现接口Lambda表达式的本质是一个匿名函数。原创 2023-09-14 11:25:23 · 1285 阅读 · 0 评论 -
Java 正则表达式的用法与实例
Java 正则表达式的用法--邮箱格式验证实例原创 2022-06-15 15:07:07 · 2741 阅读 · 0 评论 -
HttpServletRequest和HttpServletResponse的获取与使用
HttpServletRequest表示请求过来的信息,HttpServletResponse表示所有响应的信息,如果需要修改或设置返回给客户端的信息,则可通过HttpServletResponse对象来设置。除了正常的Tomcat打包传过来的HttpServletRequest和HttpServletResponse对象,也可以在其他地方自己获取。中,然后传递到上图中的service方法(doGet、doPost)中,用于给开发者来编写自己需要的逻辑。途径二:controller层中直接用。原创 2023-08-05 18:13:37 · 6595 阅读 · 0 评论 -
AOP获取切点表达式中注解的属性
自己定义个注解来搭配AOP获取一下,注解有三个属性,value,description和title在service层中的方法上使用这个自定义注解System . out . println("MyService类中的methodOne方法");System . out . println("MyService类中的methodTwo方法");原创 2023-08-04 16:21:40 · 638 阅读 · 0 评论 -
JavaWeb过滤器Filter整理
Filter,过滤器,用于对访问web服务器管理的所有web资源(例如Jsp, Servlet, 静态图片文件或静态html文件)的请求进行拦截并做出处理,从而实现一些特殊的功能,如登录控制,权限管理,过滤敏感词汇放行之前的代码:对请求进行第一次过滤,然后交给后面的代码放行:将游览器请求放行,如果还有过滤器,那么就继续交给下一个过滤器放行后的代码:对返回的Web资源再次进行过滤处理通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。原创 2023-07-23 23:57:05 · 784 阅读 · 0 评论 -
Java序列化与反序列化
什么是序列化与反序列化?序列化与反序列化的作用。什么是序列化版本号?IDEA中没有生成序列化版本号的选项原创 2023-07-02 01:33:34 · 357 阅读 · 0 评论 -
【Git】checkout切换分支后,原分支的代码被带到了切换后的分支
checkout切换分支后,原分支的代码被带到了切换后的分支原创 2023-06-28 10:17:14 · 2997 阅读 · 4 评论 -
Java枚举中定义属性
看到枚举中定义属性就很看不惯。这里梳理下Java枚举中定义属性,以及枚举在开发中的实际应用举例。枚举中枚举类的语法结构虽然和普通类不一样,但是经过编译器之后产生的也是一个class文件。该class文件再反编译回来可以看到实际上是生成了一个类。该类继承了//java为单继承原创 2023-06-01 23:45:20 · 2776 阅读 · 2 评论 -
树形结构的表设计与Java接口实现
定义返回给前端的vo类,核心属性//伪代码 //假设树形结构表的PO类叫TreePo @Data public class TreeVo extends TreePo {} //注意这里childrenTreeNodes类型为TreeVo,而不是TreePo,因为你儿子也有自己的儿子} }原创 2023-05-26 22:55:32 · 2247 阅读 · 2 评论 -
Java泛型--Java中的E、T、?
我看到集合中放进去了一个Integer类型的数据,但我get(index)拿到的是Object类型,必须向下转型为Integer。Object类型可以接收任意类型,但实际应用中会有类型转换的问题。T只能用extends来限定缩小范围,而?,也就是上面总结的。泛型方法,即调用时才指明泛型的具体类型。和 T,声明了T类型以后,T可以操作,而?引入泛型,即为集合中的元素指定一个统一的类型。实例化后,恢复成只能add类A和其子类。实例化时的类只能是类型A及其父类型。后面有内容再补吧,?原创 2023-04-20 13:57:57 · 5136 阅读 · 0 评论 -
Java中的null总结
🍁 判断一个引用数据类型是否为null...基本数据类型的包装类,若值为null,则拆箱后发生空指针异常原创 2023-04-18 00:02:26 · 1282 阅读 · 0 评论 -
什么是幂等性
使用全局唯一的主键,常用于解决Insert的幂等性。和Token相对的,使用请求序列号,即每次向服务端请求时候附带一个短时间内唯一不重复的序列号,该序列号可以是一个有序 ID,也可以是一个订单号。实现幂等,同时也增加了服务端的逻辑和成本,实际开发中,应该结合具体的场景,考虑是否引入幂等性。客户端连续点击或者调用方的超时重试等情况,例如提交订单,此种操作就可以用 Token 的机制实现防止重复提交。SQL1和SQL2不管执行多少次,结果和对库表的影响都是一样的,属于天然的幂等,而SQL3则不幂等。原创 2023-04-09 23:16:01 · 918 阅读 · 0 评论 -
SpringBoot接参注解与校验失败后的三种异常
但其实当要接收的参数较多的时候,这样一个个参数去写不合理,应该封装到一个dto类中,使用别的注解接参。是从 url 模板中获取参数值, 即这种风格的 url:http://localhost:8088/test。刚才说到:controller层用实体类接收传参的时候,POST请求用@RequestBody注解,而。日常开发中,常常在dto类的属性中使用注解进行参数合法性校验,如@NotNull、@Min,然后使用。,当校验不通过时,抛出异常,由全局异常处理器去捕捉拦截处理。原创 2023-03-30 17:27:51 · 1223 阅读 · 0 评论 -
IDEA中如何进行debug
当一行上有多个方法调用,使用Step Into (Alt + F7) 或者 Force Step Into (Alt + Shift + F7)这两个操作都是根据调用的顺序依次步入。注意:断点回退只是重新走一下流程,之前的数据改变了是无法回退的,如更新了数据库等结果无法改变(文艺的说这个是不是叫重蹈覆辙哈哈哈), 不加条件,你得一直盯着循环直到你想去的位置, 如下图, debug时一步直达i=6,不展示前几次循环。设置异常断点后,在程序中出现需要拦截的异常时,异常断点的设置, 以设置空指针为例。原创 2023-03-29 22:36:26 · 2984 阅读 · 0 评论 -
@Valid和@Validated的区别
它们规定一些校验规范即校验注解如@Null、@NotNull、@Pattern,位于javax.validation.constraints包下,只提供规范不提供实现,说白了就是一堆接口没有实现类,这堆接口放在validation-api.jar中。此时: 不管在controller层用@Valid还是@Validated, 都是只校验Person类中的@NotBlank和@NotEmpty, 而宠物属性中的age属性的@Min和name属性的@NotBlank不会被校验。原创 2023-03-29 21:04:32 · 218 阅读 · 0 评论 -
@NotNull、@NotEmpty和@NotBlank的区别
只有@NotBlank的时候才false,所以它常和String搭配。原创 2023-03-29 16:37:13 · 333 阅读 · 0 评论 -
Spring缓存注解--@Cacheable
@Cacheable注解失效的原因。缓存以键值对的形式,key用来指定键,String类型。在方法或者类上加了@Cacheable注解,但是数据并未被缓存到Redis。即缓存解析器,该属性与cacheManager 是互斥的,只能指定一个。源码中这个属性是String数组类型,即可以指定多个缓存位置。其中,#参数名和其他字符串使用+号拼接出一个key的做法很常见。指定是否使用异步模式,默认false,即同步模式。,和condition是条件满足时缓存,二者相反。条件,指定符合什么条件的时候,才进行缓存。原创 2023-03-24 15:54:49 · 6188 阅读 · 0 评论 -
【Tools】Java常用方法整理
整理一下平时写代码用到的方法或者新学的方法,就当是个个工具箱,以后省的自己定义工具类。持续更新中…原创 2023-03-24 14:41:52 · 385 阅读 · 0 评论 -
MySQL表设计---字典表的设计与接口实现
但此时有新的问题了,国籍、学历也是可以枚举完的字段,那再加个学历类型表?字典中定义好数据了,再写一个对应于dict_type的枚举类,枚举类中定义值,方便后面代码中调用枚举值做业务处理。定义接口,查询不同类型下的字典的key和value,给前端展示(当然前端也可以用html定义下拉框选项写死几个)中查,如果有,直接返回,如果缓存中没有,则调mapper层去数据库查,并把结果查询结果写进缓存备用。基于以上一个简单的背景,来看若依框架提供的字典表结构:ruoyi有两张字典相关表,一个。,将字典定义和数据分开。原创 2023-03-24 00:58:20 · 17692 阅读 · 14 评论 -
MySQL表设计思路(一对多、多对多...)
一对多,两张表,多的表加外键多对多,三张表,关系表加外键命名规范,表名以t_或者tbl_开头,增加可读性,字段采用下划线命名,避免用保留字,如select、desc主键索引名为pk_字段名,唯一索引名为uk_字段名,普通索引名为idx_字段名数据类型选择时,金额类不能选择float、double,选decimal,防止精度丢失主键的设计最好设业务主键,最好是一串无意义且不重复的数字,可采用UUID或者Auto_increment自增。原创 2023-03-23 23:19:01 · 6088 阅读 · 0 评论