springboot讀取自定義配置文件時(shí)出現(xiàn)亂碼解決方案
這是入門(mén)的第三天了,從簡(jiǎn)單的hello spring開(kāi)始,已經(jīng)慢慢接近web的樣子。接下來(lái)當(dāng)然是讀取簡(jiǎn)單的對(duì)象屬性了。
于是按照網(wǎng)上各位大神教的,簡(jiǎn)單寫(xiě)了個(gè)對(duì)象book,如上一篇,其他配置不需要做任何改動(dòng)。
package com.example.bean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "book")
@PropertySource("classpath:book.properties")
public class Book {
private String name;
private String author;
private String price;
public Book () {};
public Book(String name,String author,String price) {
this.name = name;
this.author = author;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
};
}
訪問(wèn)控制器controller如下:
@Controller
public class BookController {
@Autowired
private Book book;
@RequestMapping("/book")
@ResponseBody
public String readBook() {
return "emmmm..... The BookName is "
+book.getName()
+";and Book Author is "
+book.getAuthor()
+";and Book price is "
+book.getPrice();
}
}
book的屬性值在配置文件里面給出,我用了自定義配置文件,沒(méi)有在application.properties里面配置,那樣的話這個(gè)文件太臃腫了。

當(dāng)然了文件的編碼肯定是選的UTF-8不要懷疑,

然而遺憾的是,當(dāng)我在瀏覽器輸入http://localhost:9090/wow/book訪問(wèn)時(shí),竟然亂碼了?。?!哦shit

然后就是各種找解決方案,順便也了解到了原因,就是eclipse默認(rèn).properties文件的編碼是ISO-8859-1,那么知道了編碼的問(wèn)題,按照以前的思路來(lái)解決亂碼就比較順暢了,
無(wú)非是優(yōu)先指定服務(wù)器編碼,這就是方案一,要么指定瀏覽器編碼,然而因?yàn)椴皇莏sp訪問(wèn)所以這個(gè)行不通,要么文件編碼指定UTF-8,然而無(wú)效。
網(wǎng)上提供的解決方案也不外乎這幾種
方案一
在application里面指定tomcat的編碼:
#設(shè)置中文字符的顯示方式 #server.tomcat.uri-encoding=UTF-8 #spring.http.encoding.charset=UTF-8 #spring.http.encoding.enabled=true #spring.http.encoding.force=true #spring.messages.encoding=UTF-8
并無(wú)卵用!第一行直接就報(bào)錯(cuò)了!我的JDK1.8,spring boot2.0,可能是版本問(wèn)題,反正就是報(bào)錯(cuò)不能用。
方案二
各種通過(guò)文件編碼指定的,不可用。我eclipse默認(rèn)指定所有文件編碼是UTF-8,這個(gè)文件已經(jīng)指定,并沒(méi)有作用。
方案三
編寫(xiě)讀取properties文件的類來(lái)控制輸出流,特么的這個(gè)類在哪里調(diào)用?
方案四
嗯,eclipse需要一個(gè)讀取properties文件的插件,對(duì)的就是插件,下載一個(gè)插件據(jù)說(shuō)就能UTF-8輸出了,然而我并不想因?yàn)橐粋€(gè)文件就去下載一個(gè)插件。所以這種方案沒(méi)有試。
方案五
據(jù)說(shuō)yml可以輸出中文不亂碼???那還不簡(jiǎn)單,換個(gè)格式不就完了?
naive!
首先,將book.properties換成book.yml,各種鏈接給出的方案都是在默認(rèn)配置文件里寫(xiě)簡(jiǎn)直了。。。。。。
然后根據(jù)指點(diǎn),使用@value將屬性注入,各大網(wǎng)站給出的注入位置幾乎都在get set 方法上面,然而,
找不到文件啊衰。。。。依然亂碼啊(′д` )…彡…彡
亂碼:
package com.example.bean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(value = "book")
@PropertySource("classpath:book.yml")
public class BookYml {//仍然是亂碼
private String name;
private String author;
private String price;
public BookYml () {};
public BookYml(String name,String author,String price) {
this.name = name;
this.author = author;
this.price = price;
}
@Value("${book.name}")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Value("${book.author}")
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
@Value("${book.price}")
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
};
}
嗯,既然仍然是亂碼,說(shuō)明yml并沒(méi)有什么特權(quán)。有人說(shuō)yml也是解析成properties文件運(yùn)行的,嗯,這個(gè)解釋我服。
難道真的只能下載插件了?NONONO不要輕言放棄。更換關(guān)鍵字繼續(xù)搜索,終于找到了一篇:
終極大法來(lái)了:
方案六
package com.example.bean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
@Component
@PropertySource(value = "classpath:book.yml", ignoreResourceNotFound = true,encoding = "UTF-8" )
@ConfigurationProperties(prefix = "book")public class Book {
@Value("${name}")
private String name;
@Value("${author}")
private String author;
@Value("${price}")
private String price;
public Book () {};
public Book(String name,String author,String price) {
this.name = name;
this.author = author;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
};
}

完美!
首先要在屬性聲明上引入注解@value,并不是在get set上面。其次,在讀取數(shù)據(jù)源的@PropertySource里面指定文件編碼方式。
這樣訪問(wèn)就能正常顯示中文了。
同理,properties文件也可以這樣做,只要@PropertySource(value = "classpath:book.properties", ignoreResourceNotFound = true,encoding = "UTF-8" )就行了,根本不需要什么插件!
另,這個(gè)配置文件的路徑也可以自定義而不需要在@PropertySource(value = "classpath:“)里面給出。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Elasticsearch算分優(yōu)化方案之rescore_query示例詳解
這篇文章主要為大家介紹了Elasticsearch算分優(yōu)化方案之rescore_query示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
Java適配器模式的實(shí)現(xiàn)及應(yīng)用場(chǎng)景
適配器模式是Java中一種常用的設(shè)計(jì)模式,它通過(guò)將一個(gè)類的接口轉(zhuǎn)換成客戶端所期望的另一種接口來(lái)實(shí)現(xiàn)不同接口之間的兼容性。適配器模式主要應(yīng)用于系統(tǒng)的接口不兼容、需要擴(kuò)展接口功能以及需要適應(yīng)不同環(huán)境的場(chǎng)景2023-04-04
Spring MVC的國(guó)際化實(shí)現(xiàn)代碼
本篇文章主要介紹了Spring MVC的國(guó)際化實(shí)現(xiàn)代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08
看過(guò)就懂的java零拷貝及實(shí)現(xiàn)方式詳解
這篇文章主要為大家詳細(xì)的介紹了什么是零拷貝,傳統(tǒng)的IO執(zhí)行流程,零拷貝相關(guān)的知識(shí)點(diǎn)回顧,零拷貝實(shí)現(xiàn)的幾種方式及java提供的零拷貝方式相關(guān)內(nèi)容,有需要的朋友可以借鑒參考下2022-01-01
Mybatis下動(dòng)態(tài)sql中##和$$的區(qū)別講解
今天小編就為大家分享一篇關(guān)于Mybatis下動(dòng)態(tài)sql中##和$$的區(qū)別講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03
spring task @Scheduled注解各參數(shù)的用法
這篇文章主要介紹了spring task @Scheduled注解各參數(shù)的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
Java數(shù)據(jù)結(jié)構(gòu)篇之實(shí)現(xiàn)二叉搜索樹(shù)的核心方法
二叉搜索樹(shù)是一種常用的數(shù)據(jù)結(jié)構(gòu),它是一棵二叉樹(shù),且每個(gè)節(jié)點(diǎn)的值都大于其左子樹(shù)中任何節(jié)點(diǎn)的值,而小于其右子樹(shù)中任何節(jié)點(diǎn)的值,這篇文章主要給大家介紹了關(guān)于Java數(shù)據(jù)結(jié)構(gòu)篇之實(shí)現(xiàn)二叉搜索樹(shù)的核心方法,需要的朋友可以參考下2023-12-12
Spring?Boot集成validation實(shí)現(xiàn)參數(shù)校驗(yàn)功能
Bean?Validation?是一個(gè)運(yùn)行時(shí)的數(shù)據(jù)驗(yàn)證框架,在驗(yàn)證之后驗(yàn)證的錯(cuò)誤信息會(huì)被馬上返回,這篇文章主要介紹了Spring?Boot集成validation實(shí)現(xiàn)參數(shù)校驗(yàn)功能,需要的朋友可以參考下2024-05-05
深入分析Comparable與Comparator及Clonable三個(gè)Java接口
接口不是類,而是對(duì)類的一組需求描述,這些類要遵從接口描述的統(tǒng)一格式進(jìn)行定義,這篇文章主要為大家詳細(xì)介紹了Java的Comparable,Comparator和Cloneable的接口,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-05-05

