自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(27)
  • 收藏
  • 关注

原创 mybatis/mybatis plus lambda会话缓存失效(2)

,由于我的这个功能在单次请求内反复查询了多个表的数据,但是查询最多的表是有限的,并且我的系统分运行态和设计态,这张表是设计态的表,接口是运行接口设计表几乎不会修改,因此不考虑并发等问题。并且添加了一个ThreadLocalContextFilter,确保每次会话结束时缓存会被清空,如果没有这个类的话,很难把握数据初始化和清空的时机。在原来的机制下,由于每次调用DML语句都会清空所有mybatis缓存,设计态的表被反复查询,整个接口的调用时长超过了一秒,优化后时间减半。书接上回,有两个解决方案。

2023-04-27 18:15:17 262

原创 MYBATIS-PLUS处理连接字符串的异常

实现的是一个oracle下,判断map key-value拼接字符串的结果在某个字段中存在的功能,instr是判断字符串位置,大于0即存在。转化错误一直进到了CCJsqlParser类里,感兴趣的同学可以去看下,三万行代码命名很多数字非人类可读类。记一个非常奇怪的异常,需要把map做key-value拼接,遍历如下。但是一直会报sql转化的错误,而这个sql直接去执行是没问题的。

2023-04-27 18:01:10 472

原创 一个线程内部数据共享的数据类ThreadLocalContext

因为ThreadLocal是线程的引用,只要线程存在对象就一直存在,但是里面的key-value可能过期了不在使用了,而且在web中线程池里的线程是不断复用的,每次复用时上一次线程使用的值会引起这次逻辑的错误,比如上次缓存了工号1,第二次复用没清除也没加载新的工号,变成了2。所以要确保每次使用完后被清除了。其实slf4j提供了一个类似的工具类MDC,但是这个MDC里的值可以被日志配置文件共享,比如输出的控制台内容里可以加工号,把登陆人工号写到MDC中,业务日志里就不需要再拼userNo了。

2023-04-26 14:41:57 314

原创 mybatis/mybatis plus lambda会话缓存失效(1)

mybatis会话缓存失效了怎么办

2022-12-20 08:53:17 291

原创 mybatis-plus下_databaseId的使用

根据mybatis官方文档(https://mybatis.org/mybatis-3/zh/configuration.html)和百度搜到的各种文档,给的配置都是如下:第一步配置mybatis配置文件,第二步在mapper里指定databaseId。

2022-09-28 18:00:22 5518

原创 对于数据状态码的一点想法

数据状态随想

2022-08-20 14:48:13 124

原创 enum从数据库到java,从java到前端的序列化反序列化指南

需求场景假设我们现在有一个项目数据要入库,项目有个字段叫项目类型,数据结构如下{ "name" : "新项目", "type" : 1}一般这个时候type就需要用枚举来存储,方便代码可读性。我们在后端建一个如下的枚举和java项目类:public enum ProjectType{ SMALL(1, "小项目"), NORMAL(2, "一般项目"), BIG(3, "大项目"); private final int key; private final String va

2022-03-17 20:42:22 2072 2

原创 NACOS CONFIG无法找到配置定位排查

现象读不到配置,后台也没有打印系统所有配置,级别调到ALL了也不打印。(这个是因为nacos用的log找不到slf4j实现类,所以error都不打印,后来换logback解决了)问题解决实际关键类是这个 NacosPropertySourceLocator由于nacos的客户端版本、服务端版本以及各种依赖比较纷繁复杂,不同版本去定位到nacos配置的方式不一样,所以不能以某个版本的解决方案作为解决方案,这里只给出关键类。网上找到的一些(比如yml不可用必须要yaml才行)方案已经过时了,在我所找

2022-02-24 13:27:29 2219

原创 让Redis jackson序列化带上class类路径信息的配置方法

先放配置 @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory, Jackson2ObjectMapperBuilder builder) { ObjectMapper objectMapper = new ObjectMapper(); builder.configure(objectMapper);

2021-11-27 14:03:16 6342

原创 【正则表达式】简单的匹配要不要上正则

结论:不要需求写一个判断字符串是否满足占位符格式的方法 ,占位符格式是常见的 ${}三种写法// 第一种 public static String translatePlaceHolder(String before){ if(null == before){ return before; } if(Pattern.matches("^\\$\\{.*\\}$",before)){ return b

2021-11-23 14:26:21 214

原创 谈谈对服务器状态码的理解

前言在我们定义服务器返回状态码的时候会遇到的问题,如何定义状态码的格式?1000、2000、3000?看起来和标准的200,500,404格格不入。直接用200、500、404又担心错误码不够,各个业务端可能有自定义错误。为什么服务器要200表示成功,不是100成功,200失败。服务器状态码大家熟悉的就是200成功,404资源未找到,500服务器错误。其他的状态码可能不关心,今天看了一下状态码定义类的代码,对这里有了进一步的理解。状态码类状态码类在spring包和apache包里都有,这里以Apac

2021-10-15 09:39:13 600

原创 swagger配置按照注解去索引接口

大多数地方的swagger配置都是按照包路径索引的,在多系统场景下提供公共包的时候这种配置方式不太实用,官方有提供按照注解去找api接口的方式,.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))除此之外还有按类索引的withClassAnnotation@Beanpublic Docket defaultApi2() { Docket docket=new Docket(DocumentationT

2021-10-14 15:12:22 486

原创 Could not read JSON jackson无法序列化SimpleGrantedAuthority异常

前言用Spring Security时需要用到一个基础类,UserDetails,这个类要求有一个接口是getAuthorities,这个接口返回的默认值是HashSet,这个SimpleGrantedAuthority没有无参构造函数,所以在反序列化的时候会报错。解决方案添加自定义反序列化器@JsonDeserialize(using = CustomAuthorityDeserializer.class)private Collection<GrantedAuthority> au

2021-10-11 16:22:27 1900

原创 深入解析为什么Spring boot的Configuration注解的子类方法可以覆盖父类bean实现

前言今天想给spring security框架服务之间校验权限的功能加一个免服务内部校验,找到了全局方法权限配置的配置类GlobalMethodSecurityConfiguration。看到了类和方法上的两句话一个开启全局方法的配置,子类可以通过继承他来自定义默认值,但是必须要在子类上定义EnableGlobalMethodSecurity注解子类可以override这个方法来提供一个不同的方法拦截器最后实现效果是,定义一个类,只要继承这个类,这个类不用定义成Configuration,也

2021-09-29 17:17:34 1657 1

原创 Spring源码解析:run源码的几个关键节点

Spring源码的入口大家都知道,是run,但是点进去之后发现里面方法弯弯绕绕,不知道是遵循什么样的规则或者设计思路去实现的。其实在Spring里有一个类已经写清楚了run的关键节点,就是SpringApplicationRunListener类。下载源码,进去看他的方法注释,就可以看到它把整个run方法的周期都罗列清楚了public interface SpringApplicationRunListener { // 1 当run第一次启动时立即调用,非常早期的初始化 void start

2021-09-25 15:01:48 379

原创 Spring Security权限认证下的三种通过模式

前言Spring Security里有一个重点功能是权限认证,权限认证用于判断当前认证主体是否有访问当前资源的权限。核心接口是AccessDecisionManager,核心方法是void decide(Authentication authentication, Object object, Collection<ConfigAttribute> configAttributes) throws AccessDeniedException, InsufficientAuthenti

2021-09-23 14:11:59 343

原创 微服务场景下的异常处理设计

主要解决的问题异常在系统内部的应用和处理异常在服务之间的应用和处理异常在网关和前端交互中的处理异常定义异常是高级语言出现的定义,它用于强制程序员在编码中处理它。这里有个难懂的概念,什么是强制处理。在C语言中没有异常机制,判断一个程序是否执行顺利需要通过方法的返回值来判断,如果是1则表示执行完成,0表示执行错误。在这种机制下,如果程序员在调用方法时没有去判断1/0,而继续执行后续的编码,系统也是会“错误”地运行下去。在java中,遇到异常必须抛出或者catch,否则代码编译不通过,这样就强制程

2021-09-16 09:52:10 1628

原创 spring security oauth2 TokenEnhancer加强token不生效

问题在AuthorizationServerConfigurerAdapter.configure(AuthorizationServerEndpointsConfigurer endpoints)方法中配置了endpoints.tokenEnhancer();但是没有生效。要加强token是因为原始token信息带的太少,需要附加一些额外信息给调用方解决看了一下config里面,配置的tokenEnhancer实际上是给TokenService用的。security默认生成一个DefaultT

2021-08-28 18:15:52 2430

原创 Spring Security,Can‘t configure antMatchers after anyRequest

前提项目启动的时候报了这个错,系统用的是spring security oauth2,配置的是ResourceServerConfigurerAdapter,然后报错无法运行一般问题的解决方案一般问题的解决方案就是和报错名称一样,不要在antMatchers后面定义anyRequest,因为这个http配置是顺序读取加载的,anyRequest表示剩下的所有的。所以配置要写成http.authorizeRequests()antMatchers().permitAll().anyRequest()

2021-08-26 17:59:21 3236

原创 设计模式之包装器/wapper/装饰模式的应用

简介装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。在很多博文里会引入Decorator角色,觉得把简单问题复杂化了。等下看一下Request的应用就知道实际用起来比类图简单的多。源码中的应用以RequestWrapper为例,这是一个十分有代表性的类。在debug的时候经常会发现,request套了一个又一个,因为他们一直在互相wrapper。点到最后才看到request的参数。每一

2021-08-11 18:38:09 305

原创 AQS的setState和compareAndSetState的区别

cas是用于复合操作state的情况,与是否线程竞争无绝对关系,线程竞争的情况下如果不是复合操作也可以用setStatecas释义cas是一个用于减少多线程切换时带来的开销的一种处理方式,通过先比较再交换的方式来尝试获得锁。一般用于轻量同步的情况。当配合循环使用的时候可以实现非阻塞的获取锁。以下摘自百度百科compare and swap,解决多线程并行情况下使用锁造成性能损耗的一种机制,CAS操作包含三个操作数——内存位置(V)、预期原值(A)和新值(B)。如果内存位置的值与预期原值相匹配,那么

2021-05-30 21:08:50 1022

原创 从源码注释看java多线程的几种状态,以及几种状态的模拟

概述java定义的多线程主要有如下几种状态:创建、运行、阻塞、等待、限时等待、结束public enum State { /** * Thread state for a thread which has not yet started. */ NEW, /** * Thread state for a runnable thread. A thread in the runnable

2021-05-29 08:48:46 233 1

原创 设计模式之责任链模式,以tomcat中的过滤器为例

概述由一组处理器依次处理某个数据,在处理过程中可能对数据进行修改。详细因为大家相对的对Filter最熟悉,这里类图以filter为例了。实际Spring下的Filter会比这个复杂的多,中间隔了很多GenericFilterBean、OncePerRequestFilter等类,这里是简化图图中包含三类角色:被处理的对象:request和response,被处理的对象可以是一个可以是多个,Filter中是这一对过滤器链:负责如下事情存储所有需要执行的过滤器过滤器链的开始过滤通过遍历判断

2021-05-16 22:42:57 318

原创 设计模式之工厂模式,以通知为例

概述工厂模式解耦了调用方与被调用方。最大的例子就是Spring。我们以信息推送为例子,因为一般service都只有一个实现类,很难体会区别。而信息推送有的系统用手机,有的用app,有的用多端集成,所以是可能有多种实现的,包括spring的cache实现类,session存储类等等,这类非service类型一般都有多套实现类。信息推送类结构图如下:在有Spring之前,我们一个信息推送类的引入方式是,在所有需要推送信息的类里加一个如下代码:private MsgSender msgSender

2021-05-16 18:26:14 197

原创 委派模式的应用

delegate模式委派模式,一种动态选择执行类的模式。类图以spring的应用监听器为例// 接口public interface ApplicationListener<E extends ApplicationEvent> extends EventListener { /** * Handle an application event. * @param event the event to respond to */ void onApplicationEve

2021-05-12 21:09:02 135

原创 记一次解决spring boot cache结合redis使用json序列化的问题

描述系统使用了redis,为了方便用了spring boot cache的注解,但是redis默认序列化方式是jdk。看了网上很多解决方案都没能解决问题,很多地方都是用的redistemplate。结果存的还是jdk序列化。解决看了一下redis源码,RedisCacheConfiguration类中有一个配置redis的代码和目前redis情况很相似,所以认定是修改这里。如果不定义配置类的话,配置入口在这里,根据红框注解得知,需要自定义cacheManager 的bean

2021-02-18 10:36:13 716 2

原创 spring boot加web监听器 ServletContextListener

首先 需要继承ServletContextListenerpublic class ParamInitListener implements ServletContextListener然后在启动类上加上@ServletComponentScan注解之前看到往上的教程都这么写,没有写注解后面如果不是同包下要加上路径,搞了好多天没搞好。。@ServletComponentScan(...

2018-07-20 09:10:42 4220 4

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除