java
文章平均质量分 62
10km
这个作者很懒,什么都没留下…
展开
-
maven:release:perform错误:Presumably you have configured maven-source-plugn to execute twice times in
最近在执行maven release:perform 发布版本到maven中央仓库里出了如题的错误详细输出如下解决的办法也很简单,将pom.xml中的版本从默认的3.3.0降下来,改为3.2.1,这是maven 3.3.0的问题,也可能算是一个bug,详细说明参见下面《参考资料》提供的链接原创 2024-08-24 17:00:30 · 246 阅读 · 0 评论 -
thrift:拦截器ThriftEventHandler获取调用参数
之前写过一篇博客介绍了如何在在spring的拦截器一层获取POST请求参数。当我在thrift环境使用ThriftEventHandler拦截请求获取请求参数,也遇到了类似的问题:这个阶段,因为请求方法的参数还没有被反序列化,所以要想获取HTTP的请求参数,就要自己从HttpServletRequest中获取。要从请求内容里获取参数,就要从TProtocol里获取到,然后解析出数据就可以了。原创 2024-08-24 15:56:56 · 302 阅读 · 0 评论 -
java:获取桥接方法的参数名
如果一个方法是桥接方法,那么因为这个方法是由编译器自动生成的,所以它的方法参数名是无意的arg0,arg1。所以对于一个由编译器生成的桥接方法,如果要获取它的参数名,需要得到它实际调用的有原始方法,也就是被桥接方法,库中的同名方法,这是我从spring-core 5.3.12提取出代码,重新封装为适用JDK1.7环境的库。说实话,这个逻辑很挺复杂,但好在有人已经帮我们做了这些工作,如果在spring环境,可以使用spring的。对象中的name就是这些意义的名字。方法就能得到正确被桥接方法。原创 2024-08-24 15:39:51 · 348 阅读 · 0 评论 -
fastjson:如何快速查找JSON Object中有没有指定名字的字段?
经此一役,深刻体会antlr4虽然好学好用,但其面向通用场景生成的JSON词法语法分析器,与手撸的针对场景优化过的JSON解析器在性能上差距还是挺大的.原创 2024-08-07 12:27:29 · 841 阅读 · 0 评论 -
spring:拦截器(HandlerInterceptor)中获取POST请求参数
spring的拦截器(HandlerInterceptor)机制工作在收到HTTP请求之后,参数解析(反序列化)之前阶段。所以拦截器(HandlerInterceptor)中获取POST请求参数本身并不是问题,问题就是要解决。中就可以正常读HttpServletRequest的InputStream,而不影响后续的参数反序列化了。这个阶段,因为请求方法的参数还没有被反序列化,所以要想获取HTTP的请求参数,就要自己从。是单向的,一次性的,如果在拦截器中直接调用。获取了数据,后续方法调用解析参数时再调用。原创 2024-07-27 15:07:45 · 539 阅读 · 0 评论 -
java:aocache 与Spring Aop兼容问题
本文适用于所有AspectJ与Spring AOP混用的场景。Spring AOP 是基于动态代理的实现AOP,基于 JDK代理和CGLib代理实现运行时织入(runtime weaving)。Spring AOP的切面定义沿用了ASpectJ的注解体系,所以在Spring体系中注解定义切面的方式与ASpectJ完全兼容, 但如果一个项目中有Spring 切面定义又要使用静态态织入(CTW)的情况下,就会存在冲突问题。如下面的示例,项目中定义了一个Spring AOP切面,拦截所有带注解的服务方法。原创 2024-07-16 11:33:52 · 430 阅读 · 0 评论 -
java:aocache 0.4.0 缓存控制机制
aoocache发布第一个版本0.1.0时,没有考虑到使用aocache的项目对方法缓存的控制需求。给同事做培训时,同事提到这个需求,他希望能够有方法主动去清理指定方法的缓存:他的数据是由其他服务启动时提供的,他的方法要根据这些数据进行复杂计算返回结果。如果其他服务重启了,会刷新这些数据,如果使用aocache提供的方法缓存机制,他就需要有办法能清理这些缓存。原创 2024-06-29 11:23:04 · 413 阅读 · 0 评论 -
java:aocache的单实例缓存(二)
之前一篇博客介绍了使用注解实现单实例缓存的方式,同时也指出了这种方式的使用限制,就是这个注解定义的构造方法,不能再创建出新实例。为了更灵活方便的实现单实例。aocache最新版本0.4.0增加了支持单实例缓存的工具类SingletonSingleton提供了两种方法分别提供弱引用单实例缓存,和普通强引用单实例。原创 2024-06-29 10:36:34 · 403 阅读 · 0 评论 -
geometry:fastjson实现对JTS geometry对象的序列化和反序列化
在之前的博文中,实现了对MySQL数据库存储的WKB数据到JTS Geometry对象之间的转换。当我们从数据库中得到的Geometry对象后,我们需要把它提供给前端时,就需要将它转为JSON格式,或从前端将JSON数据反序列化为Geometry对象。本文说明使用JSON工具库Fastjson如何实现这个过程。JTS Geometry对象不是标准的Java Bean不能自动被Fastjson执行序列化和反序列化。所以我们需要为 Geometry对象实现自定义的序列化器和反序列化器。原创 2023-03-17 12:52:21 · 1067 阅读 · 0 评论 -
geometry:Jackson实现对JTS geometry对象的序列化和反序列化
在上一篇博文中,实现了对MySQL数据库存储的WKB数据到JTS Geometry对象之间的转换。当我们从数据库中得到的Geometry对象后,我们需要把它提供给前端时,就需要将它转为JSON格式,或从前端将JSON数据反序列化为Geometry对象。本文说明使用JSON工具库Jackson如何实现这个过程。JTS Geometry对象不是标准的Java Bean不能自动被Jackson执行序列化和反序列化。所以我们需要为 Geometry对象实现自定义的序列化器和反序列化器。原创 2023-03-17 12:19:03 · 1066 阅读 · 0 评论 -
sql2java-excel(二):基于apache poi实现数据库表的导出的spring web支持
sql2java是我几年年开始写的一个sql2java是一个轻量级数据库(SQL)访问代码(java)生成器。这几年一直在根据工作需要维护升级,最近的项目中需要对数据库的记录提供导出excel的功能。就开始学习apache的POI,将它封装成一个通用库成为sql2java下的子项目[sql2java-excel],本文开始介绍sql2java-excel的spring支持.......原创 2022-08-30 12:18:06 · 675 阅读 · 0 评论 -
sql2java:WhereHelper基于Beanshell(bsh)动态生成SQL语句
是一个小型嵌入式Java源代码解释器,具有对象脚本语言特性,能够动态地执行标准JAVA语法,并利用在JavaScript和Perl中常见的的松散类型、命令、闭包等通用脚本来对其进行拓展。BeanShell不仅仅可以通过运行其内部的脚本来处理Java应用程序,还可以在运行过程中动态执行你java应用程序执行java代码。因为BeanShell是用java写的,运行在同一个虚拟机的应用程序,因此可以自由地引用对象脚本并返回结果。......原创 2022-08-30 12:49:14 · 525 阅读 · 0 评论 -
aspectj:AOP编程备忘录-切面定义的注意事项
AOP编程时定义切面时需要注意的事。原创 2024-06-26 11:48:10 · 329 阅读 · 0 评论 -
java:aocache的单实例缓存(一)
定义在构造方法的使用方式是有限制的。因为就无法再创建新实例,如果又希望保持构造方法创建新实例,又能得到单实例缓存。建议不要在构造方法上定义。可以定义在构造方法上,定义在构造方法,该构建方法就成了单实例模式。介绍了aocache的基本使用,也就是说,只要构建方法参数相同,注解注解,而是定义一个有。原创 2024-06-26 11:20:16 · 554 阅读 · 0 评论 -
java:aocache:基于aspectJ实现的方法缓存工具
最近一直在做一些服务端的设计,经常遇到常量计算的问题,比如获取查找一个类的所有方法,获取有指定注解(Annnotation)的方法并查找注解的上特定的元注解是否有特定的值。比如在服务端方法拦截器上经常执行这样的计算,事实上在运行时,对于一个类(Class)或方法(Method),它在运行时就是个常量,上述复杂计算返回结果也是一个恒定的值不会改变,称之为常量计算。适用于不需要长期保存的数据。如上的模式大概就是一内一外两个方法,内部方法负责真正的计算由缓存对象调用,外部方法则直接从缓存读取数据提供给调用方。原创 2024-06-26 11:05:50 · 1387 阅读 · 0 评论 -
maven:中央仓库验证方式改变:401 Content access is protected by token
前几天向maven中央仓库发布版本,执行上传命令时报错了:[ERROR][ERROR]我的maven中央仓库的账号注册了好多年了,一直正常使用,没有出现过问题。知道了原因:此错误消息表示您可能通过提供用户名和密码明文验证执行到OSSRH的发布。然而这是以前允许的与OSSRH交互的方式,现在OSSRH发布的身份验证过程的更改了,要求使用用户令牌机制。我们的有关于的文档会对您有所帮助。原创 2024-06-22 11:08:31 · 1208 阅读 · 0 评论 -
java:Multiple Bounds--类型变量(TypeVariable)定义的高级用法--<A extends ClassA&IfA&IfB >
做Java开发工作好多年了。今天偶然翻到的源码,好奇为什么返回类型是个数组。一般不都是这样用码?T难道还能extends多个类型?同问:不应该是extend,为什么要加个s当复数?才知道类型变量定义还有的概念如下示例:ServiceD定义了A类型变量–,就要求A不仅要是ClassA的子类,还要实现IfA和IfB接口所以ClassC才能满足这个要求,终于明白为什么继承关键字是extends而不是extend,原来用到这儿了。真是又学到了,以想想什么场景需要用到这样的定义。原创 2024-06-21 14:31:45 · 257 阅读 · 0 评论 -
java:类型变量(TypeVariable)解析--基于TypeResolver实现将类型变量替换为实际类型
的类型解析工具(com.google.common.reflect.TypeResolver)将一个类型(java.lang.reflect.Type)中所有类型变量的(TypeVariable)替换为实际类型。中介绍如何如何正确解析泛型类的类型变量(TypeVariable),获取对应的实际类型。的构造方法要求是类型变量(TypeVariable)–实际类型的映射(Map)。将一个类型中的类型变量(TypeVariable)替换中实际类型。,将Map中的键值一个一个添加到TypeResolver对象。原创 2024-06-21 14:03:32 · 413 阅读 · 0 评论 -
java:类型变量(TypeVariable)解析--获取泛型类(Generic Class)所有的类型变量(TypeVariable)的实际映射类型
如何正确解析泛型类的类型变量(TypeVariable),获取对应的实际类型呢?这是个小众话题,如果何感兴趣请继续往下阅读。javasql程序编译时候ServiceC实例上所有泛型方法的参数变量(TypeVariable)都会匹配为实际的类型。比如方法在经过泛型实例化的SerivceC中:对应的参数应该是。这本是编译自动做的工作,一般来说我们不需要管它是怎么实现的。最近我的工作需要正确一个泛型类的方法正确的泛型参数并String输出,原创 2024-06-21 12:55:06 · 664 阅读 · 0 评论 -
java:服务端字段保护机制的设计思路/实现及总结
最近在做新的服务端设计时,愈发感受到信息安全在实际应用中的重要性。我们的项目中涉及大量用户信息。这些信息在应用中有的不能对外暴露,有时需要完整提供给第三方,有时只能提供脱敏信息,有时又需要根据实际请求类型来决定是否脱敏,有的数据库字段不允许用户写入。如果完全按以前的逻辑,需要针对每个不同的场景设计不同的逻辑,这些逻辑大部分又是类似或相同的。服务端由多个成员设计,对逻辑的理解程序又可能参差不齐,最终产品的设计质量也会不同.唉,越想越复杂,头疼。穷则思变,难也会思变。面对这越来越复杂的逻辑,原创 2024-06-17 14:07:39 · 896 阅读 · 1 评论 -
java:sqlj2ava的静态字段保护
sql2java中字段可见度定义对应枚举类型枚举变量JSON是否可见Thrift是否可见说明DEFAULTtruetrue默认:全可见LOCALfalsefalse仅本地可见,与远端(Spring WEB,Thrift RPC)交互时不可见THRIFTfalsetrueThrift RPC 传输时可见,Thrft RPC 客户端与服务端交互时可见JSONtruefalse。原创 2024-06-17 13:53:50 · 983 阅读 · 0 评论 -
我的开源工具beanfilter:实现基于注解(Annotation)的服务端(spring)动态字段过滤
基于注解(Annotation)实现的服务端(spring/thrift)对JavaBean类型数据在序列化和反序列化阶段动态字段过滤(IFieldFilter)和值过滤(IValueFilter)工具。为服务端提供了一个动态过滤服务方法输入输出的Java Bean参数字段的功能,字段过滤用于控制字段是否被输入/输出,值过滤用于控制字段输入/输出时的内容。原创 2024-06-15 17:09:21 · 1099 阅读 · 0 评论 -
javadoc:ClassDoc中查找指定方法(Method)对应的MethodDoc对象
javadoc的ClassDoc对象完整且结构化保存了一个类代码的所有注释信息,如果你对JavaDoc工具还不太了解,请参考我之前写的博客本文要说明的是如何从已经得到的实例中获取指定方法的注释对象(MethodDoc)。JavaDoc将Java代码注释信息解析是一个相当结构化的一组对象。Java中对一个类的所有描述对象Class,Method,Field,Constructor,Type,…但是JavaDoc是一套独立的代码,它本身并没有提供这与Java 类之前的互操作功能。原创 2024-06-15 16:45:51 · 592 阅读 · 0 评论 -
velocity:允许赋值语句赋值null:#set( $var = ...)
因为不能赋值null,在循环语句中,变量的值就还是停留在上一个不为null的值,就会导致生成的内容混乱。所以我在实际应用中需要允许。经过仔细跟踪代码,发现可以通过设置参数配置模板引擎(VelocityEngine)允许null赋值。默认是不允许对变量设置为null的。velocity的模板中赋值语句。也可以将配置参数封装为以。原创 2024-06-11 16:02:04 · 368 阅读 · 0 评论 -
jackson:基于BeanSerializer实现自定义的Java bean序列化器
之前写过一篇博客,介绍了如何继承实现自定义的反序列化器。如果要实现继承BeanDeserializer实现自定义的Java bean 解析器,与做序列化器一样,如何将一个Class转为构造方法需要的类型才是关键。原创 2024-06-07 15:14:14 · 578 阅读 · 0 评论 -
spring:基于SimpleModule实现动态管理jackson的序列化器(JsonSerializer)和反序列化器(JsonDeserializer)
这些例子,给我一个错觉,以为必须要在构造ObjectMapper实例时就要将定义了指定类型的序列化器的Module实例注册到 ObjectMapper实例才能生效。最近的工作中,我需要实现能在spring环境下,在服务运行时根据服务方法的不同动态修改数据类型的序列化器。我当前使用的jackson版本是2.12.5,我以为高版本会增加这样的方法,但是我查了最新版本,仍然没有,好吧,只能另外想办法了。有了上面的经验,我又如法炮制,研究了增加反序列化器的方法。如果我增加了序列化器后,能够序列化器清除缓存,那么。原创 2024-06-07 14:20:49 · 1241 阅读 · 0 评论 -
spring:解决findMergedRepeatableAnnotations获取可重复的元注解(meta-annotation)结果不正确问题
上面定义了三个注解,其中是可以重复注解(参见),而且还是元注解。@LeveA是@LevelB的元注解,@LevelB是@LevelC的元注解。它们三个层级关系是这样的。@LevelA 可重复 @LevelAs└─@LevelB 可重复 @LevelBs└─@LevelC如下定义了测试这些注解的类。原创 2024-06-02 19:13:32 · 427 阅读 · 1 评论 -
guava:支持数组(Object[])为Key的缓存实现
以前写过一篇博客对Guava的缓存机制进一步进行了便利化封装。已经在我的项目中被广泛使用。guava的LoadingCache在调用时要求只能有一个输入参数,算计后返回一个输出结果。但是在实际应用中计算参数往不止一个,对于两个或三个输入参数的时候还可以用之类的对象封装,但更多参数就不好搞了。为了解决多参数计算结果缓存问题,最好能用对象数组(Object[])来做为Key,这样就可以广泛支持任意类型和数量参数的计算缓存。原创 2024-05-20 15:38:46 · 479 阅读 · 0 评论 -
guava:LoadingCache缓存机制支持弱引用(WeakReference)
介绍在guava 缓存机制上实在基于弱引用(WeakReference)的缓存机制。当时还挺得意,然而在我因为其他原因又进一步看了guava 缓存机制相关的代码后,才知道guava 缓存机制本身就支持弱引用(WeakReference)模式,还非常方便,根本不需要再发明一遍轮子。唉,这走的弯路又是吃了不看文档的亏。原创 2024-05-20 11:39:33 · 407 阅读 · 0 评论 -
spring:与commons-configuration2集成中实现XML配置参数名的别名(alias)
去年写过一篇博客介绍了如何在spring环境下使用commons-configuration2提供的更丰富的配置管理功能。实现在各种Spring场景下以与application.yml中定义的配置参数一致的方式进行访问。原创 2024-05-18 15:35:18 · 564 阅读 · 0 评论 -
java8: 因为lambda表达写法造成的编译错误: java.lang.AssertionError: isSubClas
如果在 Bug Database (http://bugs.java.com) 中没有找到该错误, 请通过 Java Bug 报告页 (http://bugreport.java.com) 建立该 Java 编译器 Bug。同样的代码在Eclipse等IDE中编译可以通过,但是在命令行却不行(同样使用JDK8编译器),这一点我也很不解。是我的代码中一个泛型类的泛型参数,在代码中被广泛使用,代码有几千行,一时很难知道到底是哪一行代码出了问题。的说明,这是个编译器的BUG,将在JDK 17解决。原创 2024-05-15 18:42:15 · 843 阅读 · 1 评论 -
java:基于spring的PathMatchingResourcePatternResolver实现基于包名(package)的类扫描
spring-core提供了资源扫描实现,可以获取到java程序运行时的所有类和其他资源,所以在spring环境下,也可以使用它来自己实现查找类的功能。调用示例:SpringResourceScannerTest.java。实现代码:SpringResourceScanner.java。原创 2024-04-23 17:41:34 · 245 阅读 · 0 评论 -
java:基于guava ClassPath工具实现基于包名(package)的类扫描
google的guava库提供了一个类路径扫描的实用工具ClassPath(参见说明: https://github.com/google/guava/wiki/ReflectionExplained#classpath)工具,适用于非android的Java平台搜索类。基于它可以设计一个过滤包名的搜索工具。实现代码:GuavaPackageScanner.java。原创 2024-04-23 16:06:19 · 1153 阅读 · 0 评论 -
spring-core:理解@AliasFor注解的作用
AliasFor是spring注解体系中一个非常重要且基础的注解。顾名思义,它的基本作用就是为注解字段定义一个别名。原创 2024-04-20 12:38:26 · 608 阅读 · 0 评论 -
spring-core:获取类/方法/字段/字段上直接定义的注解
只要实现了java.lang.reflect.AnnotatedElement接口的对象(Class,Method,Field)都有这个方法,Class.getAnnotation获取注解对象,basePackages字段是空的,value字段才能获取正确的值。这个问题似乎不应该问,我们知道如果要获取一个类/方法/字段/字段上直接定义的注解是很方便的,如。Spring框架将注解(Annotation)用到了极致,对注解定义扩展了很多灵活了定义,所以在Spring框架下,要获取正确直接定义在类上的注解。原创 2024-04-19 11:08:59 · 406 阅读 · 0 评论 -
spring-core:注解合成(AnnotationUtils.synthesizeAnnotation)的使用示例
通过将包含了注解字段值的Map封装在动态代理(dynamic proxy)中,从Map提供的注释属性合成注释对象(Annotation),该动态代理实现指定注释类型的注释,并透明地强制使用@AliasFor注释的注释属性的属性别名语义。spring-core提供的AnnotationUtils工具功能很强大,也很灵活,其中的synthesizeAnnotation方法我一起没搞明白它的使用场景,直到今天我的工作用上了它,学会它的使用。就是根据Map对象定义的指定注解的字段的值 ,创建一个注解对象。原创 2024-04-18 13:56:33 · 303 阅读 · 0 评论 -
java:基于弱引用(WeakReference)的FunctionCached实现
以前写过一篇博客提到我基于guava的缓存(com.google.common.cache.LoadingCache)实现结果计算结果缓存的类FunctionCached。它很好的解决了常量结果重复计算问题。但最近我的应用场景有点变化。FunctionCached保存的结果有可能被多次重复使用,也有可能不再被继续使用。我希望这些不再被继续的使用数据能自动被回收,不要占用系统资源,如果万一它真的又被需要,就再次计算,并将结果缓存。原创 2024-04-17 16:30:16 · 434 阅读 · 0 评论 -
java:基于弱引用(WeakReference)封装Supplier实现数据根据需要自动加载
Java中的弱引用(WeakReference)是用来描述那些不会影响对象生命周期,但可能会在任何时候被垃圾收集器回收的对象引用。弱引用通常用于描述那些对象,它们非常重要,但又允许被自动回收。在现实应用场景中,有些数据我们一开始会在初始时使用,之后使用的频率会很低,但它又比较大。如果使用普通的引用,会常驻内存占用资源。这时弱引用就派上用场了。所以我们可以实现一个Supplier接口的类,封装一个弱引用实例。原创 2024-04-17 16:09:31 · 566 阅读 · 0 评论 -
spring-core:注解扫描工具MergedAnnotations获取复合注解上的元注解
介绍了通过AnnotatedElementUtils.hasMetaAnnotationTypes方法判断指定的AnnotatedElement对象(Class,Method,Field)是否是否用复合注解类型进行注解,而该复合注解是用annotationType指定的注解作元注解的。如何获取元注解对象呢?AnnotatedElementUtils并没有提供这个方法,但是参照。那么既然能判断是否存在元注解,能不能获取元注解对象呢?但它返回的是元注解的类名集合。的作元注解的复合注解。原创 2024-04-13 12:21:23 · 408 阅读 · 0 评论 -
spring-core:注解扫描工具AnnotatedElementUtils.hasMetaAnnotationTypes方法说明
hasMetaAnnotationTypes方法判断提供的AnnotatedElement对象(Class,Method,Field)是否用复合注解类型进行注解,而该复合注解是用annotationType指定的注解作元注解的。的作元注解的复合注解。原创 2024-04-13 12:16:42 · 435 阅读 · 0 评论