29

Spring Boot 常见错误及解决方法

 4 years ago
source link: https://www.infoq.cn/article/Bri5Kou8LLy5CpiBSeqy
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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:

复制代码

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

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

zuyANnF.png!web

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


Recommend

  • 71
    • 微信 mp.weixin.qq.com 5 years ago
    • Cache

    Elasticsearch常见的5个错误及解决策略

  • 41

    后端域名为A.abc.com,前端域名为B.abc.com。浏览器在访问时,会出现跨域访问。浏览器对于javascript的同源策略的限制。 HTTP请求时,请求本身会返回200,但是返回结果不会走success,并且会在浏览器console中提示: 已拦截跨源请求:同源策略禁...

  • 5
    • blog.bihe0832.com 3 years ago
    • Cache

    Android编译常见错误解决

    [本文结构] 在使用Android Studio开发过程中,经常会遇到一些gradle相关的问题,本篇文章将用于收集整理这些问题,免得以后再去google。 常见问题: 构建失...

  • 13
    • 微信 mp.weixin.qq.com 3 years ago
    • Cache

    Spring Boot 应用监控常见方案梳理

    松哥原创的 Spring Boot 视频教程已经杀青,感兴趣的小伙伴戳这里-->

  • 11
    • www.jianshu.com 3 years ago
    • Cache

    MySQL常见错误处理方法

    零一间2021.03.10 06:42:56字数 3,359阅读 82MySQL常见错误处理方法 1、MySQL数据库远程连接很慢的解决方案

  • 7

    使用 Spring Boot 提供API错误消息的好方式对于 API 用户来说,API 提供有用的错误消息非常重要。否则,很难弄清楚为什么事情不起作用。与在服务器端实际实现有用的错误响应相比,调试错误可能会很快成为客户端更大的工作。如果客户无法自己解决问题并且需要额...

  • 11

    WEB应用php5编译安装常见错误和解决办法集锦Jager · 11月22日 · 2015年linux ·

  • 8

    Kubernetes 常见错误、原因及处理方法 2019-11-24  约 2243 字   预计阅读 5 分钟 OOMKilled: Pod 的内存使用超出了 resources.limits 中的限制,被强制杀死。CrashLoopBackoff: Pod 进入 崩溃-重启

  • 4

    spring boot 升级到2.6.1以上时,启动错误 ...

  • 7
    • hearecho.github.io 2 years ago
    • Cache

    Go常见错误及处理方法

    Go常见错误 原文链接:50 Shades of Go: Traps, Gotchas, and Common Mistakes for New Golang Devs

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK