스프링 부트에서 UTF-8 문자 인코딩을 설정하는 방법은 무엇입니까?
저는 제 프로젝트에서 스프링부트를 사용하고, 스프링부트에 의해 구축된 이 jar 파일을 Centos의 서비스로 실행합니다.이 서비스를 실행하는 경우:
서비스 내 앱 시작
항상 다음 오류 메시지가 표시됩니다.
2016-08-26 09:11:02.002 ERROR 31900 --- [ main] o.s.b.c.FileEncodingApplicationListener : System property 'file.encoding' is currently 'ANSI_X3.4-1968'. It should be 'UTF-8' (as defined in 'spring.mandatoryFileEncoding').
2016-08-26 09:11:02.018 ERROR 31900 --- [ main] o.s.b.c.FileEncodingApplicationListener : Environment variable LANG is 'null'. You could use a locale setting that matches encoding='UTF-8'.
2016-08-26 09:11:02.018 ERROR 31900 --- [ main] o.s.b.c.FileEncodingApplicationListener : Environment variable LC_ALL is 'null'. You could use a locale setting that matches encoding='UTF-8'.
2016-08-26 09:11:02.031 ERROR 31900 --- [ main] o.s.boot.SpringApplication : Application startup failed
java.lang.IllegalStateException: The Java Virtual Machine has not been configured to use the desired default character encoding (UTF-8).
at org.springframework.boot.context.FileEncodingApplicationListener.onApplicationEvent(FileEncodingApplicationListener.java:74) ~[spring-boot-1.3.7.RELEASE.jar!/:1.3.7.RELEASE]
내가 이 jar 파일을 직접 실행하면, 이 응용 프로그램이 제대로 실행됩니다.
java -jar target/myApp-1.0.jar
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v1.3.7.RELEASE)
......
2016-08-26 09:54:34.954 DEBUG 32035 --- [ main] o.s.w.s.resource.ResourceUrlProvider : Found resource handler mapping: URL pattern="/**", locations=[ServletContext resource [/], class path resource [META-INF/resources/], class path resource [resources/], class path resource [static/], class path resource [public/]], resolvers=[org.springframework.web.servlet.resource.PathResourceResolver@1817d444]
2016-08-26 09:54:35.051 INFO 32035 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8000 (http)
2016-08-26 09:54:35.053 DEBUG 32035 --- [ main] o.s.w.c.s.StandardServletEnvironment : Adding [server.ports] PropertySource with highest search precedence
2016-08-26 09:54:35.061 INFO 32035 --- [ main] co.nz.myApplication : Started myApplication in 12.339 seconds (JVM running for 13.183)
다음은 pom.xml입니다.
<project>
....
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.7.RELEASE</version>
<relativePath/>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>
....
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
<jvmArguments>-Dfile.encoding=UTF8 -Dspring.profiles.active="production"</jvmArguments>
</configuration>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.5.RELEASE</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
application.properties:
....
spring.mandatory-file-encoding=UTF-8
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
....
Centos에서 로케일 설정:
$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8
저는 가능한 모든 파일 설정을 확인하지만, 여전히 이 문제를 해결하는 방법을 모르겠습니다.어떤 제안이라도 해주시면 감사하겠습니다.
솔루션
구성 파일에 추가(응용 프로그램용)/var/app/app.jar
그럴 것이다./var/app/app.conf
) 아래 줄:
export LANG='en_US.UTF-8'
원인
문제는 Linux에 있습니다.systemd
(service
) 스크립트로 테스트했습니다./etc/init.d/test
:
#/bin/bash
locale
지휘의 결과$ /etc/init.d/test
:
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
그리고 명령의 결과.$ service test
:
LANG=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=
봄에 부트 jar 파일은 systemd 스크립트가 내장되어 있으며 스프링 부트를 실행하기 전에 다음과 같이 실행됩니다.
# Source any config file
configfile="$(basename "${jarfile%.*}.conf")"
# Initialize CONF_FOLDER location defaulting to jarfolder
[[ -z "$CONF_FOLDER" ]] && CONF_FOLDER="${jarfolder}"
# shellcheck source=/dev/null
[[ -r "${CONF_FOLDER}/${configfile}" ]] && source "${CONF_FOLDER}/${configfile}"
제 답변에 따르면 https://stackoverflow.com/a/48952844/986160 을 실행해야 합니다.
mvn spring-boot:run -Drun.jvmArguments="-Dfile.encoding=UTF-8"
드디어 스프링부트 프로젝트를 제대로 시작할 수 있는 방법을 찾았습니다.
해결책은 사용입니다.sudo /etc/init.d/myApp start
대신에service myApp start
첫 번째 줄은 시스템 속성 'file.encoding'을 설정해야 한다는 것을 나타냅니다.그게 문제인 것 같아요.참고:기본 Java 문자 인코딩을 설정하시겠습니까?
언급URL : https://stackoverflow.com/questions/39163590/how-to-set-utf-8-character-encoding-in-spring-boot
'programing' 카테고리의 다른 글
FOR 루프에서 식을 통해 연결하는 이유는 무엇입니까? (0) | 2023.07.05 |
---|---|
Float/Firebase 앱에 아직 구성되지 않은 앱이 표시됩니다. (0) | 2023.07.05 |
MongoDb 2.2, 2.4 및 2.6의 성능 저하 (0) | 2023.07.05 |
MongoDB: 대량 삽입(Bulk.insert) 대 다중 삽입(삽입([...])) (0) | 2023.07.05 |
두 데이터 프레임에 서로 다른 열 집합이 있는 경우 행(rbind)으로 결합 (0) | 2023.07.05 |