springboot读取自定义配置文件时出现乱码解决方案

网友投稿 327 2022-11-21

springboot读取自定义配置文件时出现乱码解决方案

目录网上提供的解决方案也不外乎这几种方案一方案二方案三方案四方案五方案六

这是入门的第三天了,从简单的hello spring开始,已经慢慢接近web的样子。接下来当然是读取简单的对象属性了。

于是按照网上各位大神教的,简单写了个对象book,其他配置不需要做任何改动。

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;

};

}

访问控制器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的属性值在配置文件里面给出,我用了自定义配置文件,没有在application.properties里面配置,那样的话这个文件太臃肿了。

当然了文件的编码肯定是选的UTF-8不要怀疑,

然而遗憾的是,当我在浏览器输入http://localhost:9090/wow/book访问时,竟然乱码了!!!哦shit

然后就是各种找解决方案,顺便也了解到了原因,就是eclipse默认.properties文件的编码是ISO-8859-1,那么知道了编码的问题,按照以前的思路来解决乱码就比较顺畅了,

无非是优先指定服务器编码,这就是方案一,要么指定浏览器编码,然而因为不是jsp访问所以这个行不通,要么文件编码指定UTF-8,然而无效。

网上提供的解决方案也不外乎这几种

方案一

在application里面指定tomcat的编码:

#设置中文字符的显示方式

#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

并无卵用!第一行直接就报错了!我的JDK1.8,spring boot2.0,可能是版本问题,反正就是报错不能用。

方案二

各种通过文件编码指定的,不可用。我eclipse默认指定所有文件编码是UTF-8,这个文件已经指定,并没有作用。

方案三

编写读取properties文件的类来控制输出流,特么的这个类在哪里调用?

方案四

嗯,eclipse需要一个读取propWeSaBvZOerties文件的插件,对的就是插件,下载一个插件据说就能UTF-8输出了,然而我并不想因为一个文件就去下载一个插件。所以这种方案没有试。

方案五

据说yml可以输出中文不乱码???那还不简单,换个格式不就完了?

naive!

首先,将book.properties换成book.yml,各种链接给出的方案都是在默认配置文件里写简直了。。。。。。

然后根据指点,使用@value将属性注入,各大网站给出的注入位置几乎都在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 Strihttp://ng 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;

};

}

嗯,既然仍然是乱码,说明yml并没有什么特权。有人说yml也是解析成properties文件运行的,嗯,这个解释我服。

难道真的只能下载插件了?NONONO不要轻言放弃。更换关键字继续搜索,终于找到了一篇:

终极大法来了:

方案六

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上面。其次,在读取数据源的@PropertySource里面指定文件编码方式。

这样访问就能正常显示中文了。

同理,properties文件也可以这样做,只要@PropertySource(value = "classpath:book.properties", ignoreResourceNotFound = true,encoding = "UTF-8" )就行了,根本不需要什么插件!

另,这个配置文件的路径也可以自定义而不需要在@PropertySource(value = "classpath:“)里面给出。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:分布式Zookeeper面试题
下一篇:无人机六种动力驱动及常见接口
相关文章

 发表评论

暂时没有评论,来抢沙发吧~