排查Spring 无法启动的问题

风力发电机并网模型建立及仿真验证 传统能源日益匮乏,环境污染日趋严重,全球向安全、可靠和环保的可持续能源体系转型迫在眉睫,风电迎来了重要的发展契机。近年来,全球风电迅猛发展,我国已成为世界风电新增装机容量第一的国家。然而,随着风电规模的不断增大,风电场接入对系统影响不容忽视。随着变速恒频风力发电系统优越的性能突出和大容量电力电子技术的成熟,风速随机性引起的功率波动及故障情况下的动态响应,对电能质量,系统电压、频率的稳定性产生的影响需要深入研究。因而,本文结合实际项目,针对变速恒频风力发电系统建模,端口动态特性及对电网电能质量、运行稳定性的影 阅读详情

这几天有小伙伴跟我反馈,有一个项目从 kotlin 1.2 升级到 kotlin 1.3 以后 Spring 项目无法启动,报 java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'xxx' method 错误,下面咱们一个个分析排查

没有引入任何其它变量,只是更改了 kotlin 的版本,猜测可能是编译出来的字节码不一样,出问题的函数如下。

@OptionalAuthAPI@GetMapping("/page")fun getActivityGameModulePage(        @OptionalAuthRes authRes: OptionalAuthResDTO,        @RequestParam(name = "type", defaultValue = "0") type: Int = 0,        @RequestParam(name = "page", defaultValue = "0") page: Int = 0,        @RequestParam(name = "pageSize", defaultValue = "30") pageSize: Int = 0): APIResult<Page<ActivityGameModuleRespDTO>> {    return;}

kotlin 处理函数中 default 值的方法是生成一个静态的函数,比如下面的函数。

class MyTest1 {    private var m = 101    fun foo(x: Int = 100, y: String = "foo", z: Double = 1.0) {        println("" + x + y + m + z)    }    fun bar() {        foo(101, "bar")        foo(101);        foo();    }}

生成的部分字节码如下,主要看函数签名

  public final void foo(int, java.lang.String, double);    descriptor: (ILjava/lang/String;D)V    flags: ACC_PUBLIC, ACC_FINAL  public static void foo$default(MyTest1, int, java.lang.String, double, int, java.lang.Object);    descriptor: (LMyTest1;ILjava/lang/String;DILjava/lang/Object;)V    flags: ACC_PUBLIC, ACC_STATIC, ACC_SYNTHETIC

通过阅读字节码,人肉翻译为 java 就是:

public class MyTest3 {    private int m;    public void foo(int x, String y, double z) {        String str = "" + x + y + this.m + z;        System.out.println(str);    }    public void bar() {        foo$default(this, 101, "bar", 0.0D, 4, null); // 4 = b0100        foo$default(this, 101, null, 0.0D, 6, null); // 6 = b0110        foo$default(this, 0, null, 0.0D, 7, null); // 7 = b0111    }    public static void foo$default(MyTest3 thisObj, int x, String y, double z, int mask, Object obj) {        if ((mask & 0x01) != 0) {            x = 100;        }        if ((mask & 0x02) != 0) {            y = "foo";        }        if ((mask & 0x04) != 0) {            z = 1.0;        }        thisObj.foo(x, y, z);    }}

由此可以看到 kotlin 对于默认参数的处理办法就是用一个 mask,告诉后面的逻辑,特定位置的参数是否需要使用默认值。

回到原 getActivityGameModulePage 方法,这个方法上有两个注解,kotlin 在编译以后会新增一个 static 的方法

// 默认方法@OptionalAuthAPI@GetMapping("/page")public static APIResult<Page<ActivityGameModuleRespDTO>> getActivityGameByPage(...) {}// 新增方法@OptionalAuthAPI@GetMapping("/page")public static APIResult<Page<ActivityGameModuleRespDTO>> getActivityGameByPage$default(...) {}

咦,这样 Spring 在扫描的时候,不会出问题吗?两个方法都标注了 @GetMapping("/page") 要处理,理论上不论是 Koltin1.2 还是 1.3 在处理的时候都会出问题才对。

遇事不决,上字节码

kotlin 1.2 编译出来的字节码

public static APIResult getActivityGameByPage$default();   flags: ACC_PUBLIC, ACC_STATIC, ACC_BRIDGE, ACC_SYNTHETIC

kotlin 1.3 编译出来的字节码

public static APIResult getActivityGameByPage$default();    flags: ACC_PUBLIC, ACC_STATIC, ACC_SYNTHETIC

经过仔细对比,发现只有该方法的 flags 上面有一些区别,1.3 的字节码少了 ACC_BRIDGE 。

众所周知知, ACC_BRIDGE 是一种为了实现某些语言特性而由编译器自动生成的方法。除了 Kotlin,Java 自己本身在实现类型擦除等场景下也会用到 ACC_BRIDGE ,具体我这里就不展开了,大家可以去试一下。

是不是就是这个导致的问题呢?

我们来看我们当前用的什么 Spring 版本是如何处理方法的,通过调试我们进入到了这个方法

可以看到 Spring 4.3.10 版本判断是否是用户自己写的方法时的逻辑是方法不是 bridge 且方法不同于 Object 类中,因此现在情况就很明朗了。

在 kotlin1.2 中文,因为编译出的 getActivityGameByPage$default() 包含了 bridge,在 Spring 扫描的过程中就会被忽略掉,而 kotlin1.3 中,因为方法签名不包含 bridge,所以被当做了用户自己书写的方法,参与到扫描中,这样 controller 就冲突了,所以报了 Ambiguous mapping 错误。

如何解决

那这么严重的问题,难道 kotlin 不解决吗?是的,kotlin 不解决,那就只能上层框架兼容了,Spring 在后续的版本中做了修复,增加了对 ACC_SYNTHETIC 的判断,修改的地方如下:

这样,在新版本的 Spring 中,就不存在这个问题了,升级以后果然解决了问题。

Kotlin 编译器源码探秘

有了实验的结果,反过来寻找原因就很简单了,找到原因 kotlin 1.2 的源码,然后翻一翻源码,马上找到了对应的逻辑。在 4 年前的一个 commit 中,有一个伙计干掉了 ACC_BRIDGE 标记。

对应的源码修改如下

Kotlin 新版逻辑

有小伙伴又试了 kotlin 1.4+,发现问题也消失了,这又引起了我的兴趣,看了一下字节码,发现新版本的 getActivityGameByPage$default() 中,已经没有了注解,这下从源头解决了问题。这下就弄明白了

华为OD机试双机位C卷-恢复数字序列 (Py/Java/C/C++/Js/Go) 华为OD机试双机位C卷 恢复数字序列,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试 - 恢复数字序列。 阅读详情

相关推荐

Jitsi Meet保姆级自建教程:5分钟搞定私有化视频会议服务器(含Docker部署避坑指南)

本文提供了一份详尽的Jitsi Meet私有化视频会议服务器自建教程。通过Docker Compose部署方案,在5分钟内即可搭建基础服务,并深入解析了SSL/TLS证书配置、TURN服务器优化等关键步骤,确保部署的安全与可扩展性,为企业构建自主可控的远程协作平台提供完整指南。

weixin_29305337的博客 620

IDEA/Springboot/SpringCloud开发常见问题

1.idea Module is not specified 异常处理 问题通常出现在:当我们由于项目未知异常选择手动删除idea项目配置,并重启idea尝试使其生效时。 在File -> Project Structure -> Modules查看Modules信息,如果有删除,然后删掉项目重新建立即可。 2.Could not autowire. No beans of 'W...

程序员精进之路 4738

告别测序污染:手把手教你用Decontam+SCRUB+FEAST完成微生物组数据清洗全流程

本文详细解析了使用Decontam、SCRUB和FEAST三大工具完成微生物组数据清洗的全流程。从环境准备、数据导入到污染物识别、样本间污染校正及溯源分析,提供了一套可复用的污染校正工作流,帮助研究者提升数据质量,确保后续分析的可靠性。

weixin_33462927的博客 317

SpringBoot之采用外置容器配置

背景: SpringBoot默认打包方式为jar,且使用内置tomcat或者jetty容器。因为内嵌的tomcat原因导致运维或者开发会难/不灵活对内嵌tomcat调优、配置参数,所有目前还是有些公司会选择将SpringBoot的打包形式配置为war,采用外部tomcat。 jar-----> war配置 如下: 第一步: <packaging>war</pac...

向阳 598

6.2 磁悬浮轴承:软件架构与实现

本文系统阐述了磁悬浮轴承控制系统的软件架构与实现方法。采用分层架构设计,包括硬件抽象层、实时控制内核、控制算法层和应用层,确保系统实时性和可靠性。重点分析了电流环、位置环等关键控制任务的调度策略,比较了不同硬件平台(DSP、ARM、FPGA)的软件实现方案。强调模块化设计、配置化管理等工程实践,并详细介绍了从算法仿真到系统联调的完整开发流程。最后指出严格的测试验证是保证系统性能的关键,需通过多阶段测试评估起浮时间、稳态精度等核心指标。

技术工作者 755

【安徽理工大学】一文带你高分拿下计算机考研复试(85+的秘密)

一文带你高分拿下安徽理工大学计算机考研复试(85+的秘密)

猫天意的博客 1525

springboot项目启动eureka服务时,提示ServletContext错误

在springboot上添加完依赖spring-cloud-starter-netflix-eureka-server和配置后,启动服务报错,最后提示Correct the classpath of your application so that it contains a single, compatible version of javax.servlet.ServletContext。

zyf1889665的博客 637

VS Code配置MinGW64编译非线性优化库NLopt

VS Code用MinGW64编译C++代码安装MSYS2软件并配置非线性优化库NLopt和测试引用库代码的完整具体步骤。:若使用非UCRT版本(如传统MinGW64),替换所有路径中的。库文件会自动安装到MSYS2的。

weixin_30777913的博客 903

Spring boot启动遇到问题

  本主出现启动错误查找到博客解决问题,纯属笔记,原文出处:Spring Boot几种启动问题的解决方案,致谢。 1.启动Spring报错:s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.context.annotation.AnnotationConfigApplicationContext Q:新...

People of solitary 3071

期货缠论实战:文华财经笔中枢指标公式解析与博易大师应用指南

本文深入解析期货缠论实战中的文华财经笔中枢指标公式及其在博易大师平台的应用技巧。详细介绍了笔中枢指标的核心逻辑、公式拆解、参数设置及多周期联合作战策略,帮助交易者提升市场分析能力与交易胜率。特别适合期货交易者学习缠论指标的实际应用。

weixin_42522552的博客 361

mysql9.0windows安装

将这里的位置修改为你刚刚创建并复制data目录的地址即可,win11的系统使用vscode修改之后,会让你确认开启更高权限以进行保存,比较方便,window10不需要确认,修改后可以直接保存。:在修改之前,最好将下图文件进行备份,将原始的文件保存好一份,以防更改了配置之后,导致mysql服务报错,无法启动,备份好的话直接将有问题的配置文件给替换就可以,无需重新安装一次mySql。双击下载的msi文件进行安装。安装有问题的,可以直接进行卸载,新本的mySql会将注册表中的数据自动进行清除,还是很方便的。

m0_74824123的博客 6448

Spring Boot常见的报错以及解决方式

当遇到Spring Boot端口被占用的问题时,首先需要确定端口是否已被其他应用程序占用,然后尝试停止占用端口的进程或修改应用程序的端口配置。在处理过程中,应注意保留重要的工作成果,并遵循良好的开发习惯。当尝试启动Spring Boot应用程序时,如果配置的端口已被其他应用程序占用,那么应用程序将无法在该端口上启动,并会抛出相应的错误。如果在更换端口后仍然遇到端口被占用的问题,可能是由于电脑后台运行的应用过多,或者某个项目添加了另一个项目的依赖导致端口冲突。

qq_57320832的博客 3919

FPGA实现串口升级及MultiBoot(五)通过约束脚本添加IPROG实例

上一篇文章种总结了MultiBoot 关键技术,分为:一个指令、二种位流、三种方式、四样错误。针对以上四句话我们接下来详细分析。在开始解析之前我们先准备两个文件,一个是控制LED闪烁的文件,通过更换引脚约束可以控制不同LED,这样就可以指示是启动MultiBoot位流还是Golden位流。还有一个文件就是uart发送文件,会指示启动的位流格式和启动地址。文件都比较简单,就不列举了,文件详见文后的链接。对于 IPROG 指令目前有三种实现方式,分别为:1)通过约束脚本添加;2)通过ICAPE2原语

OpenFPGA的博客 2106

一次 Spring 无法启动的问题排查(字节码篇)

有同学反馈,有一个项目从 kotlin 1.2 升级到 kotlin 1.3 以后 Spring 项目无法启动,报java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'xxx' method 错误没有引入任何其它变量,只是更改了 kotlin 的版本,猜测可能是编译出来的字节码不一样,出问题的函数如下。kotlin 处理函数中 default 值的方法是生成一个静态的函数,比如下面的函数。生成的部分字节码如下,主要看函数签名。

z1ztai的博客 675

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Spring Boot应用启动慢问题排查

之前应用能正常运行,几天没关机后,再次启动应用启动很慢,甚至无法启动,但是应用不报错。目前没法重现这个错误,而且最后也没有解决问题。 这篇文章主要记录一下排查过程,以及参考网上的排查方法和可能的原因。 1、查看了CPU、内存和IO使用情况,显示当前应用占用了很高的CPU 2、jps -l 查看进程 jstack pid | less 查看堆栈 jmap pid ...

SMonkeyKing的博客 4954

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Spring Boot 启动时循环依赖的详细排查和解决步骤

使用 IDE 工具:可以使用Spring工具窗口来查看 Bean 的依赖关系。Eclipse:可以使用插件来查看 Bean 依赖图。手动检查查看所有@Component@Service和注解的类,检查它们的依赖关系。分析和排查:查看日志、使用 IDE 工具、检查 Bean 定义和依赖注入方式。解决策略:使用@Lazy注解、改用 Setter 注入、重构 Bean 设计、在类中定义 Bean。通过这些步骤,你可以有效地解决 Spring Boot 应用中的循环依赖问题,确保应用能够顺利启动。

qq_42631788的博客 3726

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

解决Springboot中@Autowired 无法注入问题

相信大家在实际开发中肯定遇到过@Autowired注解无法注入的问题,这次本人就遇到了如下图的情况。 开始没太注意,以为注入的类有问题,经查看确认并无任何问题。这时想到了可能是启动类的问题。 首先去检查一下Spring boot启动类上是否有@SpringBootApplication注解,另外 特别提醒:一定要注意文件结构   AppApplication 一定要在包的最外层,否则Sp...

baidu_27636661的博客 2795

Spring Boot 出现 “无法访问此网站“ 问题排查

在用Spring boot 搭建项目的时候,也是按照往常的步骤搭建的,但是依然访问的时候出现”无法访问此网站“ 的问题。并且项目启动是正常的。 我的启动信息: "E:\Program Files\Java\jdk1.8.0_171\bin\java" -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:57206,suspend=y,serve...

612

【低级错误】SpringCloud微服务启动后无法访问指定路径问题

【低级错误】 环境: 1.注册中心使用eureka。 2.springcloud使用Finchley.RELEASE。 3.springboot使用2.0.3release。 4.使用maven父子聚合项目。 5.IDE使用idea 问题: 通过查看注册中心发现,提供数据的springboot服务已经注册成功,但是无法通过注册成功的服务进行路径(控制类里映射了/products)访问,响应状态码为404。 解决方法: 1、通过查看对比注册中心子项目和数据服务子项目的项目结构,发现提供数据服务的子项目在fa

weixin_42645880的博客 1973

Spring Boot 启动错误排查实战:找不到或无法加载主类的三种解决方案

本文针对Spring Boot项目启动时"找不到主类"的常见错误,提供了系统性的排查指南。首先分析错误本质是JVM在classpath中找不到指定主类,然后分三步排查:1)检查主启动类是否符合规范;2)检查IDE运行配置是否正确;3)清理构建缓存并重新编译。文章特别强调容易被忽略的细节,如包名与目录结构不一致、多模块项目配置错误等,并给出针对IntelliJ IDEA和Eclipse的具体操作建议。最后指出完整查看控制台日志的重要性,帮助开发者快速定位问题根源。

聚焦学生开发者需求,分享课设毕设项目实战经验、系统开发技巧、数据库设计规范及文档排版实用方法。 2903

记录关于解决SpringMVC项目启动Tomcat失败报“子容器启动失败”的过程

刚开始学习SSM整合,就启动不了Tomcat,连续折腾了几天,网上找了大堆的方法,一直没解决。 其实主要是没定位到问题在哪儿。 1. 一开始我以为是jar包没下载完,这也是最容易想到的,网上大部分的解决方案也是这样,于是乎检查了一遍jar包,加上再重新下载了好几遍,折腾了半天,没解决。 2. 觉得可能是Tomcat的问题,于是在一个传统的web项目里面启动Tomcat发现没有问题。 3 网上搜到说...

qq_40525997的博客 1973

【项目问题积累】spring 循环依赖,Bean使用@Async注解 导致项目启动失败

一天下午,重新部署测试环境的时候,发现服务启动失败,报如下错误: ERROR o.s.web.context.ContextLoader - Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ma...

遇见未知的自己 1万+

Initializing Spring root WebApplicationContext

某日,再次启动之前运行良好的项目,spring一直停在这一句:    Initializing Spring root WebApplicationContext                就这样,一直不动,随便你等多久,就是不会往下走半步,网上搜了一堆,全是些没用的东西,你抄我我抄你.          突然,项目组里其他成员跟我说数据库的IP 和端口变了,我擦,是不是这里,

syc001的专栏 3092

Nacos服务配置好后启动项目无法在前台页面看到服务,nacos服务关闭时,项目依然可以启动,或无法启动

首先你先看一下你的启动类有没有使用启动发现注册的注解,如果没有的话记得加上。通常spring版本与springcloud以及nacos有着严格的依赖关系,因此优先排查版本引起的服务无法注册的问题。如果还是不行,那有可能是黄金搭档的问题 也就是说springcloud和alibaba springcloud之间的版本依赖问题。在 Maven 中,BOM 的作用主要是用来管理依赖的版本,并不会直接把某个依赖引入到你的项目中。也就是说bom是设计图纸 其中有各组件的默认尺寸和用料表,但不是组件本身。

m0_69460676的博客 902
上一篇: 分析Nacos配置及源码
下一篇: 观察者模式及应用场景
Java_ttcd
博客等级 码龄4年 198粉丝 190原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值