Springboot 開發過程中遇到坑點 (一)

陈子昂發表於2020-11-01

前言

之前是不會 Springboot 的,使用集中式開發,日常在學習 Java 的 Springboot 開發過程中,比如在前期開發,會容易遇到一些問題,這裡做一些記錄。

問題

1.Springboot 版本已經包含了 snakeyaml,如果依然 pom 新增 Yaml 庫 snakeyaml,啟動 Application 會遇到奇怪的錯誤。
新增了 snakeyaml 後

<dependency>
   <groupId>org.yaml</groupId>
   <artifactId>snakeyaml</artifactId>
   <version>1.13</version>
</dependency>

會出現以下錯誤。

00:05:11.649 [main] DEBUG org.springframework.boot.context.logging.ClasspathLoggingApplicationListener - Application failed to start with classpath: [file:/C:/Program%20Files/Java/jdk1.8.0_111/jre/lib/charsets.jar 省略
00:05:11.653 [main] ERROR org.springframework.boot.SpringApplication - Application run failed
java.lang.NoSuchMethodError: org.yaml.snakeyaml.LoaderOptions.setAllowDuplicateKeys(Z)V
    at org.springframework.boot.env.OriginTrackedYamlLoader.createYaml(OriginTrackedYamlLoader.java:66)
    at org.springframework.beans.factory.config.YamlProcessor.process(YamlProcessor.java:162)
    at org.springframework.boot.env.OriginTrackedYamlLoader.load(OriginTrackedYamlLoader.java:82)
    at org.springframework.boot.env.YamlPropertySourceLoader.load(YamlPropertySourceLoader.java:50)
    at org.springframework.boot.context.config.ConfigFileApplicationListener$Loader.loadDocuments(ConfigFileApplicationListener.java:607)
    at org.springframework.boot.context.config.ConfigFileApplicationListener$Loader.load(ConfigFileApplicationListener.java:523)
    at org.springframework.boot.context.config.ConfigFileApplicationListener$Loader.loadForFileExtension(ConfigFileApplicationListener.java:498)
    at org.springframework.boot.context.config.ConfigFileApplicationListener$Loader.load(ConfigFileApplicationListener.java:468)
    at org.springframework.boot.context.config.ConfigFileApplicationListener$Loader.lambda$null$7(ConfigFileApplicationListener.java:447)
    at java.lang.Iterable.forEach(Iterable.java:75)
    省略

但是編譯時不會拋錯。
這類錯誤是 執行緒上下文類載入器在這個啟動 Application 環境事件時失敗,這裡是 ApplicationFailedEvent 型別,去掉這個 Pom 包就可以恢復。

2.controller 層同個檔案裡面,新增到 RequestMapping 路由一樣,編譯時不會錯誤,但執行 Application 會拋錯。
拋錯資訊這個省略。@RequestMapping註解會將 HTTP,請求對映到 MVC 和 REST 控制器的處理方法上,因為是對映,所以不能有重複的。
一般情況下,@RequestMapping("/routepath") routepath 路由 API 是小寫的。

3.一開始寫@Value(${xxx1.xxx2})
xxx1 是 Yaml 檔案裡面的第一層,xxx2 是 Yaml 檔案裡面的第二層。一開始寫的時候容易少寫一個 $,啟動時會產生拋錯。

4.ModelMapper 和 RestTemplate 需要進行配置才能使用。
ModelMapper 不配置就會拋錯。

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2020-10-28 17:22:04.607 ERROR 8280 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   :


***************************
APPLICATION FAILED TO START
***************************

Description:
Field modelMapper in com.lilith.ordercenter.service.OrderCenterService required a bean of type 'org.modelmapper.ModelMapper' that could not be found.
The injection point has the following annotations:
        - @org.springframework.beans.factory.annotation.Autowired(required=true)
Action:
Consider defining a bean of type 'org.modelmapper.ModelMapper' in your configuration.

需要配置

@Bean
    public ModelMapper modelMapper() {
        return new ModelMapper();
    }

Springboot 版本 2.x 以上需要配置 RestTemplate。

@Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder) {
        return builder.build();
    }

PS:配置@Bean是指 spring 階段是 Xml 裡面的 bean,這裡是指@Configuration啟動容器 +@Bean註冊 Bean。
@Configuration標註在類上,等於是 spring 的 xml 配置檔案中的,配置在 spring 容器 (Application Context)。

相關文章