写点什么

Spring Boot 常见错误及解决方法

  • 2020-01-06
  • 本文字数:2078 字

    阅读完需:约 7 分钟

Spring Boot 常见错误及解决方法

Spring Boot 作为 Java 生态中最流行的开发框架,意味着被数以万计的开发者所使用。下面根据我们自身遇到的问题,加上用户提供的一些反馈,来大致梳理下 Spring Boot 的常见错误及解决方法。

找不到配置?配置不对?配置被覆盖?

Spring Boot 配置加载过程解析:


1、Spring Boot 配置的加载有着约定俗成的步骤: 从 resources 目录下加载 application.properties/application.yml ; 再根据里面的 spring.profiles.active 来加载不同 profile 的配置文件 application-dev.properties/application-dev.yml (比如加载 profile 为 dev 的配置文件)。


2、Spring Boot 所有的配置来源会被构造成 PropertySource,比如 -D 参数, – 参数, 系统参数, 配置文件配置等等。这些 PropertySource 最终会被添加到 List 中,获取配置的时候会遍历这个 List ,直到第一次获取对应 key 的配置,所以会存在优先级的问题。具体配置的优先级参考:


https://stackoverflow.com/a/45822571


配置覆盖案例:


Nacos 服务注册的 IP 可以通过 spring.cloud.nacos.discovery.ip 设置,当我们打成 JAR 包之后,如需修改注册 IP,可以通过 -Dspring.cloud.nacos.discovery.ip=xxx(-D 参数配置的优先级比配置文件要高)。


配置问题排查:


进入 http://host:port/actuator/env 这个 endpoint 查看具体的配置项属于哪个 PropertySource。

Jar 包启动不了

执行 Spring Boot 构建的 jar 包后,返回 “my.jar 中没有主清单属性” 错误。


错误分析: Spring Boot 的正常 jar 包运行方是通过 spring-boot-loader 这个模块里的 JarLauncher 完成的,该类内部提供了一套运行的规范。


解决方案: 在 pom 里加上 spring-boot-maven-plugin 的 maven 插件配置(该插件会在 jar 里加入 spring-boot-loader 的代码,并在 MANIFEST.MF 中的 Main-Class 里写入 JarLauncher):


<plugin>       <groupId>org.springframework.boot</groupId>       <artifactId>spring-boot-maven-plugin</artifactId></plugin>
复制代码

自动化配置类没有被加载

条件注解是 Spring Boot 的核心特性之一,第三方的 starter 或我们自定义的 starter 内部都会加载一些 AutoConfiguration,有时候会存在一些 AutoConfiguration 没有被加载的情况。导致出现 NoSuchBeanDefinitionException, UnsatisfiedDependencyException 等异常排查步骤(三种方式):


1、把 spring 的日志级别调到 debug 级别: logging.level.org.springframework: debug。


2、从 ApplicationContext 中获取 ConditionEvaluationReport,得到内部的 ConditionEvaluationReport.ConditionAndOutcomes 类中的输出信息。


3、进入 http://host:port/actuator/conditions 这个 endpoint 查看条件注解的 match 情况。


这是日志打印的不满足条件的 AutoConfiguratoin:


Unconditional classes:----------------------    org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration    org.springframework.cloud.client.ReactiveCommonsClientAutoConfiguration    org.springframework.boot.actuate.autoconfigure.info.InfoContributorAutoConfiguration    org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration    org.springframework.cloud.client.discovery.simple.SimpleDiscoveryClientAutoConfiguration    org.springframework.cloud.client.CommonsClientAutoConfiguration    org.springframework.cloud.commons.httpclient.HttpClientConfiguration    org.springframework.boot.actuate.autoconfigure.endpoint.EndpointAutoConfiguration    org.springframework.cloud.loadbalancer.config.BlockingLoadBalancerClientAutoConfiguration
复制代码

定义的 Component 没有被扫描到

@SpringBootApplication 注解内部也会使用 @ComponentScan 注解用于扫描 Component 。默认情况下会扫描 @SpringBootApplication 注解修饰的入口类的包以及它下面的子包中所有的 Component 。


@ComponentScan:


https://github.com/StabilityMan/StabilityGuide/blob/master/ComponentScan


这是推荐的包结构中项目的结构:



exclude 包下的类不会被扫描到,card 包下的类会被扫描到。

Actuator Endpoint 访问不了

访问 Actuator,出现 404 错误。


解决方案:


1、Spring Boot 2.x 版本对 Actuator 做了大量的修改,其中访问的路径从


http://host:port/endpointid


变成了


http://host:port/actuator/endpointid 。


确保访问的路径正确。


2、Endpoint 有 Security 要求,


在配置里加上 management.endpoints.web.exposure.include=* 即可。


作者介绍


方剑,花名洛夜,GitHub ID @fangjian0423,开源爱好者,阿里巴巴高级开发工程师,阿里云产品 EDAS 开发,Spring Cloud Alibaba 开源项目负责人。


本文转载自公众号阿里巴巴中间件(ID:Aliware_2018)。


原文链接


https://mp.weixin.qq.com/s?__biz=MzU4NzU0MDIzOQ==&mid=2247488596&idx=3&sn=93c0ce3efdd2f0136cb3621faf9b8e84&chksm=fdeb2634ca9caf22ae182fddcaba8aec61d2b7b7477ab2724ad13d9e56daa9c7b8113bf1de14&scene=27#wechat_redirect


2020-01-06 14:005089

评论

发布
暂无评论
发现更多内容

阿里云助力抖音,为2022世界杯护航

云布道师

阿里云

连续7年领跑!在华为云桌面,藏了一盘数字办公的大棋

i生活i科技

向云而行华为云桌面成数字办公首选

i生活i科技

不会PS怎么办?教你3种方法一键更换证件照背景色

互联网民工阿强

word ps 人像抠图 背景替换 证件照

以英雄之名为S9总决赛助攻!虎牙直播and华为云CDN,team work才会赢

爱尚科技

会议云上开,华为云会议具有超高性价比

路过的憨憨

用华为云桌面有多爽?问问设计师就知道了!

与时俱进的时代

在华为云桌面Workspace上,启泰智能工业设计效率翻倍

i生活i科技

DeFi模式NFT游戏开发技术

薇電13242772558

NFT链游

QCN9074 802.11ax 4x4 MU-MIMO 6GHz wifi6E//qcn9072 qcn9024 qcn64 wallys

wallysmeng

QCN9074 QCN9024 QCN9072 qcn9064

【基础知识】PCB板上的字母数字是什么意思,代表哪些元器件?

华秋PCB

元器件 PCB PCB设计

百度工程师带你体验引擎中的nodejs

百度Geek说

JavaScript 前端 nodejs 12 月 PK 榜

安全且高效!华为云会议全方位提升开会体验

路过的憨憨

集结多种便捷功能,华为云会议大幅提升开会体验

路过的憨憨

双十二优惠,华为云桌面喊你来采购

与时俱进的时代

【FAQ】在华为鸿蒙车机上集成华为帐号的常见问题总结

HarmonyOS SDK

HMS Core

神州云科打出“组合拳”,双轨超高可用架构引领信创高质量发展

通明湖

schema设计与管理

刺猬

集结多种便捷功能,华为云会议让沟通简单化

路过的憨憨

论坛回顾|蚂蚁供应链安全建设实践

墨菲安全

软件供应链安全

华为云CDN为芒果TV加速,打造丝滑“追剧观综”的观看体验

爱尚科技

远程灵活办公,华为云桌面了解一下

与时俱进的时代

为什么说华为云CDN更值得选择?

爱尚科技

四大领先优势加持,华为云会议服务更省心可靠!

路过的憨憨

教你用JavaScript实现大转盘

小院里的霍大侠

JavaScript 初学者 入门实战

RabbitMQ、RocketMQ、Kafka延迟队列实现

艾小仙

Java kafka RocketMQ RabbitMQ 延迟队列

数据价值深度挖掘,分析服务上线“探索”能力

HarmonyOS SDK

HMS Core

华为云CDN节点扩增力度加大,构建全球智能边缘网络

爱尚科技

云上智慧化办公,华为云桌面成为首选!

与时俱进的时代

华为云CDN助力企业用户体验全面优化,让企业“惠”加速

爱尚科技

华为云CDN通过全站加速引领网站性能全面优化

爱尚科技

Spring Boot 常见错误及解决方法_开源_方剑_InfoQ精选文章