写点什么

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:004570

评论

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

扒一扒互联网Markdown的那些事儿

Java研究者

互联网 markdown 发展趋势

极致性能优化:前端SSR渲染利器Qwik.js | 京东云技术团队

京东科技开发者

性能优化 前端 前端性能 企业号11月PK榜 Qwik.js

Java 利用JUC CountDownLatch 线程池Executors 实现多线程操作

javaNice

Java 多线程

12月9-10日·上海线下·CSM认证周末班【提前报名特惠】“敏捷教练必修课”CST导师亲授

ShineScrum

图像处理软件Photoshop 2024 (ps) for Mac v25.1

展初云

Mac ps Mac软件 Photoshop 2024

云工作流 CloudFlow 重磅发布,流程式开发让云上应用构建更简单

Serverless Devs

阿里云 Serverless 函数计算FC

解决Lightroom无法使用修改照片的问题

Rose

Lightroom Classic 2022 Mac破解软件 Lightroom无法使用 LR2024 Mac中文

Eudic欧路词典 for Mac英语学习工具

展初云

Mac 欧路词典 英语学习软件

大家都在用的数据安全运维管理系统是哪家?有什么功能?

行云管家

数字化 数据安全 数据运维

Paste for Mac剪切板管理工具

展初云

Mac Mac软件 剪切板

UUID意想不到的block

FunTester

线上JAVA应用平稳运行一段时间后出现JVM崩溃问题 | 京东云技术团队

京东科技开发者

Java 定时任务 JVM 企业号11月PK榜

微前端无界机制浅析 | 京东物流技术团队

京东科技开发者

前端 源码剖析 微前端 无界 企业号11月PK榜

什么是大模型?一文读懂大模型的基本概念

九章云极DataCanvas

Golang面试题从浅入深高频必刷「2023版」

王中阳Go

Go golang 面试题 大厂面经 最新面试题

你的停机真的优雅么?第二弹来袭 | 京东云技术团队

京东科技开发者

定时任务 数据一致性 企业号11月PK榜 停机

助力应用创新提升开发效率聚焦OpenHarmony技术大会开发者工具分论坛

科技热闻

专业终端SSH工具 SecureCRT注册码正式版

胖墩儿不胖y

Mac软件 终端SSH仿真工具 终端仿真器

安全好用的远程协同运维软件重点推荐-行云管家

行云管家

远程运维 运维软件 远程系统 远程协同 协同运维软件

Util 应用框架快速入门(一)- 创建示例数据库

何镇汐

后端 开源框架

倒计时丨3天后,我们直播间见!

RestCloud

零代码

商用解决方案助力产业链实现自循环 OpenHarmony技术大会硬件(南向)生态分论坛圆满落幕

科技热闻

如何使用 Loadgen 来简化 HTTP API 请求的集成测试

极限实验室

集成测试 loadgen 极限科技

助力工业数字化!TDengine 与恩菲 MIM+ 工业互联网平台实现兼容性互认

TDengine

tdengine 时序数据库

过去60年145项全球开源系统杰出成果颁布,百度飞桨登榜!

飞桨PaddlePaddle

深度学习 paddle 飞桨

挖掘潜力 拥抱挑战 第二届OpenHarmony技术大会OS内核及视窗分论坛召开

科技热闻

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