写点什么

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

评论

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

码农理财(一)

北漂码农有话说

理财

程序员的晚餐 | 5 月 17 日 当西红柿遇上鱼

清远

美食

一种练好英语口语的方法

董一凡

学习

机会,是不会让你准备好的

Winann

学习 生活 知识管理 机会

写作对我的意义

Neco.W

总结 思考 写作 感悟

微服务涉及的技术生态有哪些?

攀岩飞鱼

分布式 微服务 方法论 软件架构

2020年比以往任何时候更想做成的使命感

乐少

有问必答(2020-05-09):如何督促自己做好一件事情?

冯夷

生活

Docker 镜像制作教程:针对不同语言的精简策略

米开朗基杨

Docker Dockerfile

DevOps生命周期,你想知道的全都在这里了!

禅道项目管理

DevOps 测试 持续集成

OneData之OneModel

KAMI

大数据 数据中台 数据治理 OneData

【高级进阶】写给大忙人看的JDK14新特性

知春秋

Java java 14 java 14 新特性

少说废话,先干起来

大辉辉

学习 个人成长 自律

Kotlin协程实践之进程、线程、协程

陈吉米

Java kotlin 协程 Coroutine

从连续两届图灵奖(2018-2019)看GPU发展史

GPU

人工智能 gpu 计算机基础 计算机图形学 计算机体系结构

发布Maven包的正确姿势

廖雪峰

maven 开源

数据治理与OneData 体系

KAMI

大数据 数据中台 数据治理 OneData

OneData之OneID

KAMI

大数据 数据中台 数据治理 OneData

计算机中的递归对普通人有什么启示?

BitSea

算法

Collaboration on SaaS

zhenglei

SaaS Collaboration Cisco Webex

都前后端分离了,咱就别做页面跳转了!统统 JSON 交互

江南一点雨

spring Spring Boot spring security

11 万字的字节码编程系列合集放送(ASM、Javassist、Byte-buddy、Javaagent)

小傅哥

Java asm bytebuddy 《字节码编程》

从零到部署:用 Vue 和 Express 实现迷你全栈电商应用(一)

图雀社区

node.js vue.js Vue

OneData之OneService

KAMI

大数据 数据中台 数据治理 OneData

EasyExcel最权威教程

知春秋

Java Excel EasyExcel

微服务为什么要有服务发现与注册?

攀岩飞鱼

微服务

游戏夜读 | Scikit-learn迎来0.21版本

game1night

sync.Map源码分析

陈思敏捷

源码 源码分析 Go 语言

浅谈Cloud Native技术对云上产品的影响

韩超

Docker Kubernetes 云原生 IaaS PaaS

回“疫”录(19):都什么时候了,还在搞“填表抗疫”

小天同学

疫情 回忆录 现实纪录 纪实 形式主义

Java如何处理异常情况

Rayjun

Java 异常

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