10 月 23 - 25 日,QCon 上海站即将召开,现在购票,享9折优惠 了解详情
写点什么

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

评论

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

成为 DevOps 工程师需要具备哪些能力?

飞算JavaAI开发助手

Apache Impala架构解析及与Hive、SparkSQL的性能比较

编程江湖

助力数字经济 明源云助力不动产行业打造数字新引擎

科技热闻

OpenHarmony标准设备应用开发(一)——HelloWorld

OpenHarmony开发者

Hello World ! OpenHarmony 标准设备

提高企业产品交付效率系列(1)—— 企业应用一键安装和升级

北京好雨科技有限公司

Kubernetes PaaS rainbond

提效24.3%!看OA预算管理系统的低代码开发实践

鲸品堂

低代码开发

web前端培训-通过JS 可以读取电脑上所有数据

@零度

JavaScript 前端开发

摩尔定律的现在及未来

科技新消息

安利一个小众但实用的导航网站(推荐收藏)

小炮

导航网站

vivo 商品中台的可视化微前端实践

vivo互联网技术

可视化 前端特效

想做好分布式架构?这个知识点一定要理解透!

博文视点Broadview

TDengine 在智慧矿山系统中的应用

TDengine

看完微信抢红包算法你就明白,为啥你不是手气最佳

华为云开发者联盟

算法 微信红包 手气最佳 剩余金额随机法 割线法

四大功能!带你初识 Fabric | 容器网络系列第2期

BoCloud博云

云原生 容器网络方案

OceanBase 在证券行业基金资管场景落地实践与解决方案

OceanBase 数据库

证券 oceanbase

【Git教程】Git最全使用指南

阿里云云效

git 云计算 阿里云 DevOps Codeup

华为云GaussDB专家走进课堂,跟莘莘学子聊聊数据库

华为云开发者联盟

数据库 人才培养 华为云 GaussDB 华为云数据库

还搞不明白,一次性给你总结好网络层概念

华为云开发者联盟

网络协议 IP 网络层 组网

AppCube快速开发问卷调查应用在WeLink发布上线

DS小龙哥

3月月更

CPU的“花招”已耍完?无指令集架构颠覆旧套路

OneFlow

人工智能 机器学习 深度学习 英伟达 芯片

Linux常用命令分享:有手就会,但能解决95%以上的问题

优麒麟

Linux 开源 计算机 优麒麟

web前端技术Mongoose详解

编程江湖

java培训-Redis 原理与知识总结分享 不愁面试

@零度

redis JAVA开发

行业分析| 音视频呼叫邀请适用于多领域

anyRTC开发者

音视频 WebRTC 语音通话 视频通话 呼叫邀请

FabEdge V0.5.0 新特性:支持跨集群服务访问

BoCloud博云

开源 边缘计算 cncf

NetCore性能排查

神农写代码

Java篇|忘记格式化代码,把女朋友鸽了

Jianmu

Java 自动化 持续集成 建木CI 格式化代码

给工厂做开发,竟然喝着咖啡听“交响”?

阿里云云效

云计算 阿里云 DevOps 研发 研发提效

TDengine 和 InfluxDB 查询性能对比测试报告

TDengine

数据库 tdengine

Spark的job、stage和task的机制论述

编程江湖

在 Rainbond 中一键安装高可用 Nacos 集群

北京好雨科技有限公司

开源 Kubernetes nacos PaaS rainbond

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