写点什么

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

评论

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

阿里全新推出:微服务突击手册,把所有操作都写出来了

Java你猿哥

微服务 微服务架构 Spring Cloud SSM框架

我在 20 年的软件工程师生涯中学到的 20 件事

宇宙之一粟

翻译 软技能

Flomesh 软负载 FLB GA 版本发布

Flomesh

负载均衡 云原生 Pipy

揭秘云原生时代企业可观测体系落地实践

嘉为蓝鲸

云原生应用 云原生(Cloud Native) 可观测宇宙

python统计程序耗时 | python小知识

AIWeker

Python python小知识 三周年连更

ChatGPT,音乐,与数据库

沃趣科技

数据库 云原生 音乐 ChatGPT

阿里P7了!全靠死磕这份阿里全彩版"并发编程笔记",大厂必备!

Java你猿哥

Java 并发编程 架构师 java面试 Java工程师

改写同事代码——血压操作集锦第一弹

Java你猿哥

Java IDEA java编程 SSM框架 表单设计

Flink CDC 在易车的应用实践

Apache Flink

大数据 flink 实时计算

不懂就问,Milvus 新上线的资源组功能到底怎么样?

Zilliz

非结构化数据 Milvus Zilliz

多家大厂CTO鼎力推荐的微服务架构设计模式真的硬核

小小怪下士

Java 程序员 微服务 后端

把脉分布式事务的模型、协议和方案

小小怪下士

Java 分布式 分布式事务 后端

Unity 之 月签到累计签到代码实现(ScriptableObject应用 | DoTween入场动画)

陈言必行

Unity 三周年连更

基于 Flink CDC 的现代数据栈实践

Apache Flink

大数据 flink 实时计算

治理告警风暴,告警降噪的一些典型手段

巴辉特

告警风暴 告警降噪

中船互联与嘉为科技共同打造“IT运维管理”融合解决方案

嘉为蓝鲸

自动化运维 IT 运维 中船集团

Redis删除键命令: 新手用del,老手用unlink,有何区别?

Java你猿哥

Java redis SSM框架 Java工程师 delete

90%的Java开发人员都会犯的5个错误

做梦都在改BUG

Spring Boot 实现接口幂等性的 4 种方案

做梦都在改BUG

Java Spring Boot

大型SRE组织设计与建设落地,且看腾讯蓝鲸如何做?

嘉为蓝鲸

腾讯 运维自动化 蓝鲸

Oracle 23c 新特性实操体验优质文章汇总

墨天轮

数据库 oracle sql 新版本/特性解读

3月寒窗!啃透美团保姆级分布式进阶技术手册,4月终入美团定L8

Java你猿哥

Java 分布式 SSM框架 分布式数据 分布式消息

基于 Flink CDC 的现代数据栈实践

Apache Flink

大数据 flink 实时计算

【FAQ】关于华为推送服务因营销消息频次管控导致服务通讯类消息下发失败的解决方案

HarmonyOS SDK

HMS Core

从「搭子」文化,看融云如何助力垂类社交应用增长

融云 RongCloud

融云 Z世代 通讯 交友 搭子

HummerRisk V1.0 :架构升级说明

HummerCloud

开源 云安全 云原生安全

多云转晴:Databend 的天空计算之路

Databend

字节跳动正式开源分布式训练调度框架 Primus

字节跳动开源

开源 算法 流批一体

代码质量难评估?一文带你用 SonarQube 分析代码质量!

Java你猿哥

架构师 代码 SSM框架 sonar

Alibaba最新神作!耗时182天肝出来1015页分布式全栈手册太香了

Java你猿哥

Java 分布式 SSM框架 分布式核心原理解析 分布式开发

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