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)。

相關文章